Я пытался поработать с предварительными декларациями, но, похоже, это не сработало
Вы не показали нам, что "не работает", или вкаким образом это «не сработало», но в вашем коде есть одно место, где вы можете заменить полное определение типа на прямое объявление, а два - там, где вы не можете.
Где вы не можете
Нестатические члены данных должны быть полных типов:
[C++11: 9.2/10]:
Не static
(9.4) члены данных не должны иметьнеполные типы.В частности, класс C
не должен содержать нестатического члена класса C
, но он может содержать указатель или ссылку на объект класса C
.
Итак,B
in A
и C::EnumType
in B
не могут быть объявлены вперед.
BTW: Это не относится к static
элементам данных, которые может быть объявленным вперед:
[C++11: 9.4.2/2]:
Объявление члена данных static
в его определении класса не является определением и может иметь неполный тип, отличный от cv-уточнено void
.
Где вы можете
Однако то же самое не относится к типам параметров в объявлении функции-члена, поэтому вы можете заранее объявить A
в C(A a)
:
class A;
class C {
public:
C(A a);
enum EnumType {
// enum stuff
};
// more stuff
};
#include
как можно меньше в заголовках.
Почему вам не нужно
IЯ уверен, что это какой-то недостаток дизайна с моей стороны, главным образом потому, что я пришел из Java-фона
Я не вижу, что в Java есть что-тоЭто связано с тем, что все эти классы зависят друг от друга.Возможно C::EnumType
должно быть вместо B::EnumType
?Постарайтесь сделать ваши занятия более самостоятельными.Предварительные декларации все хорошо, но жизнь была бы намного проще, если бы вы решили коренную проблему тесной связи вашего дизайна.