At the time you declare your member, you are still defining the A
class, so the type A
is still undefined.
However, when you write A*
, the compiler already knows that A
stands for a class name, and so the type “pointer to A” is defined. That’s why you can embed a pointer to the type your are defining.
The same logic applies also for other types, so if you just write:
class Foo;
You declare the class Foo, but you never define it. You can write:
Foo* foo;
But not:
Foo foo;
On another hand, what memory structure would you expect for your type A
if the compiler allowed a recursive definition ?
However, its sometimes logically valid to have a type that somehow refer to another instance of the same type. People usually use pointers for that or even better: smart pointers (like boost::shared_ptr
) to avoid having to deal with manual deletion.
Something like:
class A
{
private:
boost::shared_ptr<A> member;
};