Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Директивы пре(и)процессора. Проблема. Как разрешать цмклические ссылки? 
:(
    Опции темы
np9mi7
  Дата 22.4.2005, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Добрый день.

Есть класс
Код

// A.h
#ifndef AH
#define AH
//---------------------------------------------------------------------------
#include "B.h"
class A
{
    public:
        void someF (const B& refB)
        {
            ;
        }
};
#endif

Его метод в качестве параметра принимает ссылку на объект другого класса. Да все бы ничего, вот только это объект имеет ссылку на A
Код

// В.н
#ifndef BH
#define BH
//---------------------------------------------------------------------------
#include "A.h"

class B
{
        const A& a;
    public:
        B(const A& refA) : a (refA)
        {
            ;
        }
        ~B()
        {
            ;
        }
        void someF ()
        {
            ;
        }
};
#endif


Те оба объекта имеют ссылки в обоих направлениях. Компилятор BCB 6.0 это компилировать не хочет.
Можно конечно все в одном файле определить тогда проблем не будет, а как если а двух (файлах)? Как это разрешить при помощи директив препроцессора?

Заранее благодарен за ответы


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
CHi
Дата 22.4.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 12.4.2005

Репутация: 1
Всего: 1



Выносить реализацию из определения класса. А вообще не стоит так делать н и к о г д а. Изменяй архитектуру классов.
PM MAIL   Вверх
Alastis
Дата 22.4.2005, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

Репутация: 4
Всего: 10



а что если в B.h просто после инклуда объявить:
Код

class A;

В VC++ 7.1 все компилится тогда без проблем


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
np9mi7
  Дата 22.4.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
Выносить реализацию из определения класса. А вообще не стоит так делать н и к о г д а. Изменяй архитектуру классов.
, не в этом проблема smile
Цитата
а что если в B.h просто после инклуда объявить:
Выделить всёКод C++
1:

class A;

В VC++ 7.1 все компилится тогда без проблем
, ок работает, интересно как это директивами разрулить?

Это сообщение отредактировал(а) np9mi7 - 22.4.2005, 11:55


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Alastis
Дата 22.4.2005, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

Репутация: 4
Всего: 10



Цитата(np9mi7 @ 22.4.2005, 11:53)
ок работает, интересно как это директивами разрулить?

честно говоря не знаю, зачем тебе вообще нужно тут что-то директивами разруливать... просто перед использованием объекта какого то класса компилятор должен знать, что он определен где то


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
pablo
Дата 22.4.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Цитата

а что если в B.h просто после инклуда объявить:

Код C++
Код

class A;


В VC++ 7.1 все компилится тогда без проблем

Такая техника называется "Forward Declaration", и в данном случае, она именно то, что надо.

А с препроцессором получится замкнутый круг,который некому разорвать. Поетому и не компилется, на мой взгляд.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
Fire-Plug
Дата 23.4.2005, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



Конечно, forward declaration позволит избежать проблем с компиляцией файлов исх. кода классов, находящихся в циклической зависимости.
НО CHi прав на все 100% - циклическая зависимость классов есть признак недостаточности, а зачастую - ошибок в анализе и/или дизайне. Действительно, почему классу А требуются методы/данные класса Б и наоборот, классу Б нужно что-то из класса А? Да скорее всего потому, что некие методы/атрибуты объявлены в к-либо одном или обоих классах ошибочно, например, из-за недостатков анализа или знаний в определенной доменной области.
Или же если для обоих классов требуются нечто общее, то скорее всего, требуется некая третья структура, к-рая должна реализовать это общее и предоставить общую функциональность/данные каждому из классов. Имеется достаточно способов как это сделать.
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
np9mi7
Дата 8.5.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
Или же если для обоих классов требуются нечто общее, то скорее всего, требуется некая третья структура, к-рая должна реализовать это общее и предоставить общую функциональность/данные каждому из классов. Имеется достаточно способов как это сделать.
, подскажи, если не сложно, где про эти способы можно посмотреть???


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
chipset
Дата 9.5.2005, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



Насколько я понимаю, подразумеваются паттерны типа Медиатор или Адаптер.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1191 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.