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 {};
我刚修改了给定here的示例。
为什么结构转发声明有效但不是类前向声明?
是否与命名空间有关 - tag namespace
和typedef namespace
?我知道没有typedef的结构定义会转到标记命名空间。
结构只是包含所有公共成员的类。所以,我希望它们的行为类似。
答案 0 :(得分:7)
前向声明适用于课程,但您可以预期。
首先,您必须在class B;
例程的代码之前编写main
。
然后你必须写B * bb;
而不是B bb;
。只能在类定义之后构造一个B类型的对象。
此行为的原因如下:编译器不知道它必须在堆栈上为B类实例分配多少字节,因为此信息取决于类的定义(您没有给出那时候)。然而,可以在B的前向声明之后构造指向B类实例的指针,因为指针的大小是先前已知的(并且对于所有指针类型通常都是相同的)。
答案 1 :(得分:4)
班级前瞻性声明工作正常;你只是没有包括一个。添加
class B;
在bb
声明之上,它将起作用
编辑:正如kibibu指出的那样,除非是指针,否则你不能声明一个不完整的类型,所以
B* bb;
会起作用,但你的方式不会。好的电话
答案 2 :(得分:1)
我不认为这行“struct t tt;”将编译。
在C ++中,struct和class是相同的,除了具有不同的默认访问权限。
答案 3 :(得分:1)
你的专栏:
struct t tt;
不能为我编译,我得到:
.\TestApp.cpp(11) : error C2079: 'tt' uses undefined struct 'main::t'
(这是Visual C ++ 2008)