为什么我们不能在同一个类中声明一个类的对象?

时间:2011-02-09 05:26:46

标签: c++

class A
{
  A a;//why can't we do this
};

6 个答案:

答案 0 :(得分:19)

因为这个类的大小是无限的。

(这是通过指定你不能将不完整的类型作为成员,只能引用或指向它们来完成语言,并且A在类定义结束之前是不完整的类型。)< / p>

答案 1 :(得分:17)

你可以做到

class A {
    A* a;
}

因为它不需要知道A的大小。

答案 2 :(得分:10)

我认为你是来自Java还是什么? A a会创建一个A类型的完整实例,其中包含A,其中包含A,其中包含A

你可能正在考虑这个问题:

class A
{
  A *a; // A pointer to A, not a full instance
};

答案 3 :(得分:6)

A a;//why can't we do this

因为A是一个不完整的类型,因为它尚未定义,而是它被定义。当编译器在A内看到它时,编译器需要知道class A的完整类型,并且由于A不完整,不能确定它的大小,它无法确定成员变量a将占用多少空间,因此无法编译它。

但是,由于指针的大小对于编译器来说是众所周知的,无论它是什么类型的指针。您可以在类中定义指针,如下所示:

class A
{
    A *pA; //okay since sizeof(pA) == sizeof(void*) == well-known to the compiler!
};

在线演示:http://www.ideone.com/oS5Ir

答案 4 :(得分:1)

在C ++中:        你不能这样做,因为它将是递归结构(计算对象大小没有结束),克服这个问题,
使用自引用指针,即具有相同类类型地址的指针。

class A
{
    A* aObj; // Self Referential Pointer
}

答案 5 :(得分:1)

这是你可以拥有指向A类对象的指针的方式,这样就不需要在编译时声明类A的大小。

class A {
A* a;
};