为什么数据成员只有定义了class才能指定为class类型? (摘自本书"C++ primer")

Why data members can be specified to be of a class type only if the class has been defined? (from the book "C++ primer")

"C++ primer" 书中有一节是关于 class 声明和定义的。这句话我完全不懂:

data members can be specified to be of a class type only if the class has been defined.

我不明白这句话背后的逻辑。如何指定数据成员为class类型,这个动作是什么意思?

我相信这意味着这将编译:

 class A
 {
 public:
     A() {/* empty */}
 };

 class B
 {
 public:
     B() {/* empty */}

 private:
     A myClassMember;  // ok
 };

.....但这不会:

 class A;  // forward declaration only!

 class B
 {
 public:
     B() {/* empty */}

 private:
     A myClassMember;   // error, class A has only been declared, not defined!
 };

这意味着 member 的这个规范是无效的,因为 A 被声明但没有定义:

class A;

class B {
  A member;
};

不允许这样做的一个原因是 sizeof(A) 未知。

然而,这是有效的,因为 A 被定义为:

class A {
  int value;
};

class B {
  A member;
};

而且即使A没有定义(只声明)也是有效的,因为member不是class类型,而是指针类型:

class B {
  A* member;
};

这意味着,对于class类型T的non-static class数据成员的声明,T必须是complete.

(In general, when the size and layout of T must be known.)

例如

class foo;    // forward declaration
class bar {
    foo f;    // error; foo is incomplete
};

另一方面,

class foo {}; // definition
class bar {
    foo f;    // fine; foo is complete
};