Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Директивы пре(и)процессора. Проблема.


Автор: np9mi7 22.4.2005, 11:18
Добрый день.

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

// 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 это компилировать не хочет.
Можно конечно все в одном файле определить тогда проблем не будет, а как если а двух (файлах)? Как это разрешить при помощи директив препроцессора?

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

Автор: CHi 22.4.2005, 11:50
Выносить реализацию из определения класса. А вообще не стоит так делать н и к о г д а. Изменяй архитектуру классов.

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

class A;

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

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

class A;

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

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

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

Автор: pablo 22.4.2005, 14:07
Цитата

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

Код C++
Код

class A;


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

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

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

Автор: Fire-Plug 23.4.2005, 06:06
Конечно, forward declaration позволит избежать проблем с компиляцией файлов исх. кода классов, находящихся в циклической зависимости.
НО CHi прав на все 100% - циклическая зависимость классов есть признак недостаточности, а зачастую - ошибок в анализе и/или дизайне. Действительно, почему классу А требуются методы/данные класса Б и наоборот, классу Б нужно что-то из класса А? Да скорее всего потому, что некие методы/атрибуты объявлены в к-либо одном или обоих классах ошибочно, например, из-за недостатков анализа или знаний в определенной доменной области.
Или же если для обоих классов требуются нечто общее, то скорее всего, требуется некая третья структура, к-рая должна реализовать это общее и предоставить общую функциональность/данные каждому из классов. Имеется достаточно способов как это сделать.

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)