Search code examples
c++typesmemberprivate-membersincomplete-type

"Incomplete type" in class which has a member of the same type of the class itself


I have a class that should have a private member of the same class, something like:

class A {
    private:
        A member;
}

But it tells me that member is an incomplete type. Why? It doesn't tell me incomplete type if I use a pointer, but I'd rather not use a pointer. Any help is appreciated


Solution

  • 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;
    };