Как уже упоминали несколько других, круговая ссылка является вашей проблемой. Еще одна фраза для этого будет «взаимозависимость». Однако вместо того, чтобы пытаться найти правильный синтаксис, чтобы заставить ваше приложение компилироваться и запускаться (я предполагаю, что реальная проблема существует в программе, немного более продвинутой, чем вы опубликовали), я бы посоветовал вам атаковать проблему с помощью объекта ориентированная на дизайн точка зрения.
Как правило, по возможности следует избегать взаимозависимостей. Я уже сталкивался с этой проблемой в своем собственном коде ранее (что привело к нескольким дням отладки, вырывания волос и проклятия моего компилятора), и вот как я наконец смог ее преодолеть. Я представлю разбавленную версию моей собственной проблемы в качестве конкретного примера того, как решить эту проблему, так что, надеюсь, вы сможете извлечь скрытый смысл, стоящий за всем этим, и все это будет иметь смысл в конце.
Допустим, у нас есть два класса: Data и DataAnalyzer
Данные содержат ссылку на DataAnalyzer (используется для анализа данных), а DataAnalyzer содержит ссылку на данные (данные, которые будут проанализированы) - взаимозависимость! Чтобы устранить эту зависимость, мы извлекаем интерфейс (в C ++, чистый виртуальный класс) из DataAnalyzer, который определяет публичные методы / атрибуты, необходимые для DataAnalyzer. Это может выглядеть примерно так:
class IAnalyzer
{
public:
virtual void Analyze () = 0;
};
Когда мы определяем DataAnalyzer, мы делаем это следующим образом:
class DataAnalyzer : public IAnalyzer
{
public:
DataAnalyzer (Data* data);
virtual void Analyze (); // defined in DataAnalyzer.cpp
};
А данные выглядят так:
class Data
{
public:
Data ();
IAnalyzer* Analyzer;
};
Где-то, в вашем классе контроллеров, у вас может быть что-то вроде:
void main ()
{
Data* data = new Data ();
data->Analyzer = new DataAnalyzer (data);
}
Теперь Data стоит сам по себе (насколько ему известно, IAnalyzer не требует ссылки на Data), и только DataAnalyzer зависит от Data. Если вы хотите продолжать работу, вы можете продолжить удаление зависимости DataAnalyzer от Data, но ради простой разрыва взаимозависимости этого должно быть достаточно.
Предупреждение: Я не проверял этот код при компиляции, поэтому для правильной компиляции и запуска может потребоваться небольшая настройка.
Удачи!