Чтобы уточнить: предварительное объявление позволяет вам работать с объектом, если оно очень ограничено:
struct Foo; // forward declaration
int bar(Foo* f); // allowed, makes sense in a header file
Foo* baz(); // allowed
Foo* f = new Foo(); // not allowed, as the compiler doesn't
// know how big a Foo object is
// and therefore can't allocate that much
// memory and return a pointer to it
f->quux(); // also not allowed, as the compiler doesn't know
// what members Foo has
В некоторых случаях могут помочь предварительные объявления.Например, если функции в заголовке только когда-либо принимают указатели на объекты вместо объектов, тогда вам не нужно #include
полное определение класса для этого заголовка.Это может улучшить время компиляции.Но реализация этого заголовка почти гарантированно потребует #include
соответствующего определения, потому что вы, вероятно, захотите разместить эти объекты, вызвать методы для этих объектов и т. Д., И вам нужно больше, чем предварительное объявление для этого.