Reputation: 4803
I've been reading some on forward declarations, including in this forum. They all say that it saves us from including the header file, However the following code generates an error:
#ifndef CLASSA_H_
#define CLASSA_H_
class B;
class A {
public:
A();
~A();
int getCount();
private:
static int _count;
int _num;
B _b1; //ERROR
};
compiler says:
A.h:23: error: field ‘_b1’ has incomplete type
I noticed that if i make _b1
of type B*
the problem is solved.
So is forward declaration good only for pointer types?
If i want A
to hold B
object i have to #inlcude "B.h"
?
thanks!
Upvotes: 6
Views: 5825
Reputation: 56986
The compiler has to know the exact definition of class B
to determine at least what size to give to class A
. If you use a pointer, it knows its size.
Note that circular dependencies are not possible. If you want
class A { B b; };
class B { A a; };
then A and B must have infinite size...
Upvotes: 10
Reputation: 224179
You can use a forward-declared type to
You will need a full definition of a type in order to
If you remember that a forward-declaration actually is a misnomed declaration (there is no other way of declaring a class type, so any declaration of a class type is a forward declaration), and that, whenever you are opening the braces after class
/struct
/union
plus identifier, you are defining a class, all you need to remember is that you:
.
, ->
, and ::
in front)Upvotes: 6
Reputation: 56397
Yes, forward declarations work only if you use Pointers and References to the forward-declared type. If you use the object by value, you need to include the complete header file.
Upvotes: 0
Reputation: 2001
Yes, you would have to
#include "B.h"
if you want to include B in your class A.
Upvotes: 0