为什么数据成员只有定义了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
};
"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
};