![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| nns2009 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
Сейчас пишу геометрию, и мне нужно чтобы структура Line имела доступ к Vector и наоборот.
Пробовал написать так, как показал (предварительно объявить структуры (struct Line; struct Vector;) ), но в ответ мне выдаётся ошибка начиная с выделенной строчки. Где я ошибся и что надо исправить? Это сообщение отредактировал(а) nns2009 - 3.10.2011, 18:19 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
самое время обобщить схожие моменты и вынести их в общий базовый тип. Добавлено через 1 минуту и 20 секунд потому что использовать Vector можно после описания реализации, а не форварда. |
|||
|
||||
| nns2009 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
- Добавлено через 1 минуту и 1 секунду взаимная зависимость - это не хорошо. |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Выноси объявления структур в .h-файл(ы), а реализацию методов - в .cpp.
Добавлено через 1 минуту и 52 секунды Собственно в разные файлы выносить даже не обязательно. Суть: сначала в исходнике должны быть полностью объявлены обе структуры, а ниже может быть реализован код методов. -------------------- You're face to face With man who sold the world |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вынести реализацию в .cpp , куда и включать нужные хидеры..
в остальных местах использовать forward declaration.. Добавлено через 3 минуты и 27 секунд
в данном вопросе это не лучшее решение.. Добавлено через 4 минуты и 37 секунд newbee, а ньюби оказывается уже все написала.. Добавлено через 7 минут и 1 секунду т.е. нужно не искать базовый класс, а наоборот, выделить еще один (после-) слой, в который и вынести операции по взаимной геометрии.. |
|||
|
||||
| math64 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
gcc такое компирирует:
Т.е. для вложенного класса без полей достаточно только предварительного объявления, чтобы его копировать. (не проверял, как ведут другие компиляторы) Но если добавить поля, уже не компилируется:
Добавлено @ 17:20 Так тоже компилируется:
т.е. нужно чтобы вложенные классы не обращались к внешнему Это сообщение отредактировал(а) math64 - 4.10.2011, 17:22 |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Должны так же. В С++ (по стандарту) тела функций-членов компилируются в контексте полного описания класса, к которому они принадлежат. Т.е. включая и то, что определено в классе после них. |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Мда, в этом все С++-сники. Половина работы - борьба с языком.
-------------------- You're face to face With man who sold the world |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Всё таки не понятно тогда, почему мой второй пример не компилируется - т.е. функции-члены вложенного класса компилируются в контексте когда уже имеются полные описания вложенных классов, но для внешнего класса ещё полного описания нет. T.о. если топик-стартер хочет программировать в стиле C#, он может поместить свои классы во внешний класс:
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Поэтому и не компилируются, т.к. обращаются к полям внешнего класса, а он еще не до конца описан. А правило, по которому компиляция функций-членов откладывается до конца описания класса, не распространяется на вложенные классы |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |