Есть два класса - А и Б. Каждому экземпляру класса А отвечает конкретный экземпляр класса Б и наоборот. Для обеспечения такого однозначного соответствия между классами удобно было бы включить в качестве элемента класса А ссылку на экземпляр класса Б и наоборот. Вопрос в том, как это правильно объявить? Поскольку если сначала объявлять класс А, например, то компилятор не узнает ссылку на класс Б, которая является его элементом. Как быть? Заранее благодарен за советы.
Ссылку нельзя. Указатель - можно. Код (Text): class B; class A{ B* b; public: A(B* pb): b(pb) { b->setA(this); } }; class B{ A* a; public: B(): a(NULL) {} void setA(A* a) { this->a = a; } };
Общевойсковая теория проектирования ПО гласит, что подобные "кольцевые" зависимости - вне устава В случае подобных зависимостей на уровне классов все не так плачевно, но чем на более высоком уровне архитектуры они появляются, тем это все более и более чревато неприятностями.