Авто-необходимые классы? - PullRequest
0 голосов
/ 07 июня 2010

Предположим, у меня есть класс A и класс B.

.h для A требуется .h для B, а для .h для B нужен .h для A. (нужно = #include).

Все .h имеют защиту:

#ifndef _classX_
#define _classX_
...
...
#endif

Но если я скомпилирую .cpp из A, то когда он включает в себя .h of B, класс B не может включать.h класса A, потому что класс A уже использует охрану.

Как я могу решить эту проблему?

Ответы [ 2 ]

5 голосов
/ 07 июня 2010

Вам понадобится предварительное объявление одного из классов.

// a.h
// do not #include b.h

class B;    // forward declaration

class A {
    ....
    B * b;
};

Обратите внимание, что класс A не может содержать фактический экземпляр B - он должен быть указателем или ссылкой. Вы также не можете вызывать какие-либо функции через указатель B в заголовке - они должны идти в исходном файле .cpp, который включает в себя оба заголовка.

3 голосов
/ 07 июня 2010

Один из них должен обойти, чтобы не включать его. Во многих случаях это возможно, так что вы можете переместить #include в файл .cpp

class A {
  // no need for header of B here
  void f(B b);

  // no need for header of B here either
  B *b;
};

Как правило, для объявлений функций, определения которых находятся в файлах .cpp, вам не нужно включать #include в заголовок. Для членов класса заголовки нужны только в том случае, если вы хотите, чтобы они были встроены в качестве объектов-значений. Вам необходимо изменить их на указатели (или умные указатели) и new в этом случае в файле .cpp. Чтобы компилятор знал, что такое B в моем примере выше, вам просто нужно поместить предварительное объявление перед определением A, например:

class B;
...