Laz*_*zer 3 c++ structure class forward-declaration
int main() {
B bb; //does not compile (neither does class B bb;)
C cc; //does not compile
struct t tt; //compiles
class B {}; //HERE is the class B defination
struct s { struct t * pt; }; //compiles
struct t { struct s * ps; };
return 0;
}
class C {};
Run Code Online (Sandbox Code Playgroud)
我刚修改了这里给出的例子.
为什么结构转发声明有效,而不是类前向声明?
它是否与名称空间有关 - tag namespace而且typedef namespace?我知道没有typedef的结构定义会转到标记命名空间.
结构只是包含所有公共成员的类.所以,我希望他们的行为类似.
前向声明适用于类,但其他时候你已经预期.首先,你必须class B;在main日常代码之前写.然后你必须写B * bb;而不是B bb;.只能在类定义之后构造B类型的对象.
此行为的原因如下:编译器不知道它必须在堆栈上为B类实例分配多少字节,因为此信息取决于类的定义(当时您没有给出).然而,可以在B的前向声明之后构造指向类B的实例的指针,因为指针的大小是先前已知的(并且对于所有指针类型通常是相同的).