Форвардное объявление может работать и для классов:
class Foo;
class Bar {
public:
Foo *myFoo; // This has to be a pointer, thanks for catching this!
};
class Foo {
public:
int value;
};
Приведенный выше код показывает предварительное объявление класса Foo с использованием переменной типа Foo * в другом классе (Bar), а затем фактическое определение класса Foo. C ++ не волнует, если вы оставите вещи нереализованными до тех пор, пока вы реализуете их перед использованием кода. Определение указателей на объекты определенного типа не означает «использование его кода».
Быстрый, грязный ответ, но я надеюсь, что это поможет.
Редактировать: Объявление переменной без указателя для класса, который не реализован, НЕ будет компилироваться, как указано в ответах. Это именно то, что я имел в виду под «использованием его кода». В этом случае конструктор Foo будет вызываться всякий раз, когда вызывается конструктор Bar, учитывая, что он имеет переменную-член типа Foo. Поскольку компилятор не знает, что вы планируете реализовать Foo позже, он выдаст ошибку. Извините за мою ошибку;).