![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
np9mi7 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Добрый день.
Есть класс
Его метод в качестве параметра принимает ссылку на объект другого класса. Да все бы ничего, вот только это объект имеет ссылку на A
Те оба объекта имеют ссылки в обоих направлениях. Компилятор BCB 6.0 это компилировать не хочет. Можно конечно все в одном файле определить тогда проблем не будет, а как если а двух (файлах)? Как это разрешить при помощи директив препроцессора? Заранее благодарен за ответы |
||||
|
|||||
CHi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.4.2005 Репутация: 1 Всего: 1 |
Выносить реализацию из определения класса. А вообще не стоит так делать н и к о г д а. Изменяй архитектуру классов.
|
|||
|
||||
Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
а что если в B.h просто после инклуда объявить:
В VC++ 7.1 все компилится тогда без проблем -------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
np9mi7 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
![]()
Это сообщение отредактировал(а) np9mi7 - 22.4.2005, 11:55 |
||||
|
|||||
Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
честно говоря не знаю, зачем тебе вообще нужно тут что-то директивами разруливать... просто перед использованием объекта какого то класса компилятор должен знать, что он определен где то -------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
pablo |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Такая техника называется "Forward Declaration", и в данном случае, она именно то, что надо. А с препроцессором получится замкнутый круг,который некому разорвать. Поетому и не компилется, на мой взгляд. -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
||||
|
|||||
Fire-Plug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Конечно, forward declaration позволит избежать проблем с компиляцией файлов исх. кода классов, находящихся в циклической зависимости.
НО CHi прав на все 100% - циклическая зависимость классов есть признак недостаточности, а зачастую - ошибок в анализе и/или дизайне. Действительно, почему классу А требуются методы/данные класса Б и наоборот, классу Б нужно что-то из класса А? Да скорее всего потому, что некие методы/атрибуты объявлены в к-либо одном или обоих классах ошибочно, например, из-за недостатков анализа или знаний в определенной доменной области. Или же если для обоих классов требуются нечто общее, то скорее всего, требуется некая третья структура, к-рая должна реализовать это общее и предоставить общую функциональность/данные каждому из классов. Имеется достаточно способов как это сделать. --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
|
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Насколько я понимаю, подразумеваются паттерны типа Медиатор или Адаптер.
--------------------
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |