Почему предварительное объявление не исправляет циклическую зависимость? - PullRequest
1 голос
/ 06 февраля 2011

У меня есть три класса: TopClass, который содержит экземпляр указателя BottomClass. BottomClass содержит указатель на HelperClass. HelperClass сохраняет указатель на TopClass. Появляется циклическая зависимость, и в HelperClass.

требуется предварительное объявление.

Все это иллюстрируется следующими фрагментами кода:

#include "BottomLevel.h"

namespace foo
{
  class TopLevel
  {
  private:
    BottomLevel* item;
  };
}

-

#include "HelperClass.h"

namespace foo
{
  class BottomLevel
  {
  private:
    HelperClass* item;
  };
}

-

class TopLevel; // forward declaration here

namespace foo
{
  class HelperClass
  {
  public
    HelperClass(TopLevel* item);
  };
}

Проблема возникает при попытке сделать что-то в файле реализации. Если я #include "TopClass.h" в файле cpp, я получаю ошибки компиляции, в которых говорится, что "перегруженная функция-член не найдена - используется неопределенный тип 'TopLevel'" (ОШИБКИ C2511 и C2027).

Тогда, если я не сделаю #include, у меня все еще останутся ошибки C2027, потому что я пытаюсь использовать объявленный вперед тип.

Я просто знаю, что есть способ исправить это, я уверен, что делал это раньше, но я не могу на всю жизнь вспомнить, что я должен делать. Любая помощь, пожалуйста?

Ответы [ 2 ]

6 голосов
/ 06 февраля 2011

Проблема в том, что вы ожидаете прямого объявления TopLevel вне пространства имен foo, поэтому компилятор никогда не находит класс foo::TopLevel.

Попробуйте переместить объявление вперед TopLevel внутриfoo Пространство имен.

0 голосов
/ 06 февраля 2011

Вам нужна предварительная декларация формы

namespace foo {
class TopLevel;
class BottomLevel;
class HelperClass;
}

Тогда порядок не имеет значения [потому что вы используете указатели]

...