如何使用下面定义的类?

时间:2011-03-09 12:28:23

标签: c++ class

class A{
 public:
 B b;
};

class B{
 public:
 A a;
};

我不能写A类“B b”,因为B类定义如下。有什么方法可以使它发挥作用吗?

感谢

4 个答案:

答案 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;
};

原因:

编译器需要知道每个类(AB)的对象将如何布局在内存中。这包括每个对象需要多少内存。由于类成员需要一定量的内存依赖于他们的成员,因此编译器只允许你声明一个类成员,如果它已经看到该成员的类的声明< / em>的

另一方面,指针总是占用相同数量的内存。这就是为什么它足以让你告诉编译器“B是一个类;我想要一个指向B的指针”。 “B是一个类”部分对应于上面的class B;行,称为前向声明