class A{
public:
B b;
};
class B{
public:
A a;
};
我不能写A类“B b”,因为B类定义如下。有什么方法可以使它发挥作用吗?
感谢
答案 0 :(得分:7)
这是不可能的。您需要在其中一个类中使用指针或引用。
class B; // forward declare class B
class A {
public:
B * b;
};
class B {
public:
A a;
};
至于为什么不可能:A包含一个B包含一个A包含一个B ...递归没有结束。
如果您习惯于语言(例如java),默认情况下所有对象变量都是指针/引用,请注意c ++中不是这种情况。当您将class A { public: B b; };
完整的B
嵌入写入A时,它不会在A中被引用。在C ++中,您需要明确指出你想要一个引用(B & b;
)或一个指针(B * b;
)
答案 1 :(得分:3)
想想看:在B类的一个对象里面有一个A类的对象,在它里面有一个B类的对象。这在物理上是不可能的!对象B的大小是多少?
sizeof(B) > sizeof(A) > sizeof(B)
你必须使用指针,就像建议的其他答案一样。
答案 2 :(得分:2)
没有办法让它发挥作用。您应该使用前向声明和指向其中一个类
的指针class B;
class A{
public:
B *b;
};
class B{
public:
A a;
};
那是因为当你写B b
时,编译器必须知道B是什么。但是如果你做了一个前向声明,那么编译器会知道B
是某个类,你将能够创建B的指针和引用。
答案 3 :(得分:2)
仅当您将两个成员对象中的至少一个更改为指针时。您可以通过向前声明其他类来声明指向此类对象的成员指针,如下所示:
class B;
class A{
public:
B* pb;
};
class B{
public:
A a;
};
原因:
编译器需要知道每个类(A
和B
)的对象将如何布局在内存中。这包括每个对象需要多少内存。由于类成员需要一定量的内存依赖于他们的成员,因此编译器只允许你声明一个类成员,如果它已经看到该成员的类的声明< / em>的
B
是一个类;我想要一个指向B
的指针”。 “B
是一个类”部分对应于上面的class B;
行,称为前向声明。