How to use class which defined below?

2019-08-15 20:59发布

问题:

class A{
 public:
 B b;
};

class B{
 public:
 A a;
};

I can't write in A class "B b" because class B defined below. Is any way to make it work?

thanks

回答1:

This is not possible. You need to use a pointer or a reference in one of the classes.

class B; // forward declare class B
class A {
public:
  B * b;
};

class B {
public:
  A a;
};

As to why it isn't possible: A contains a B contains an A contains a B ... There's no end to the recursion.

If you're used to languages (such as e.g. java) where all object variables are pointers/references by default, note that this is not the case in c++. When you write class A { public: B b; }; a complete B is embedded into A, it is not referred to within A. In C++ you need to explicitly indicate that you want a reference (B & b;) or a pointer (B * b;)



回答2:

Think about it: Inside an object of class B there's an object of class A, and inside it there's an object of class B. This is physically impossible! What will be the size of object B?

sizeof(B) > sizeof(A) > sizeof(B)

You must use pointers, like the other answer suggested.



回答3:

There is no way to make it work. You should use forward declaration and a pointer to one of the class

class B;
class A{
 public:
 B *b;
};

class B{
 public:
 A a;
};

That is because when you're writing B b the compiler must know what B is. But if you make a forward declaration then compiler will know that B is some class and you will be able to create pointers and references of B.



回答4:

Only if you change at least one of the two member objects to a pointer. You would be able to declare a member pointer to such an object by forward-declaring the other class, like this:

class B;

class A{
 public:
 B* pb;
};

class B{
 public:
 A a;
};

The reason for this:

The compiler needs to know how objects of each class (A and B) will be laid out in memory. This includes how much memory will be needed for each object. Since class members require an amount of memory that depends on their members, it follows that the compiler can only allow you to declare a class member if it has seen the declaration of that member's class first.

Pointers, on the other hand, always take up the same amount of memory. This is why it's enough for you to tell the compiler "B is a class; I want a pointer to B here". The "B is a class" part corresponds to the class B; line above, which is called a forward declaration.



标签: c++ class