GMa*_*ckG 18

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

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

  • 那么如果它的大小无限呢?记忆现在很便宜! (12认同)
  • @James:让我想起那个想写一个程序的人,这个程序创造了多达23个字母的每个可能的单词,当我告诉他他需要超过一百万TB的硬盘时,他并没有退缩...... (2认同)

Foo*_*Bah 17

你可以做

class A {
    A* a;
}
Run Code Online (Sandbox Code Playgroud)

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


Ebo*_*ike 10

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

你可能在想这个:

class A
{
  A *a; // A pointer to A, not a full instance
};
Run Code Online (Sandbox Code Playgroud)


Naw*_*waz 6

A a;//why can't we do this
Run Code Online (Sandbox Code Playgroud)

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

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

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

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