2010-04-16 26 views
3
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 namespacetypedef namespace?我知道没有typedefs的结构定义会转到标记名称空间。

结构只是所有公共成员的类。所以,我期望他们的行为类似。

+1

该块之前是否有任何代码?看起来你在B bb之前实际上没有任何前向声明; – John 2010-04-16 04:43:19

回答

7

向前声明工程类,但其他然后你有预期。 首先,您必须在main例程的代码之前编写class B;。 然后你必须写B * bb;而不是B bb;。只有在类定义之后,才可以构造类型B的对象。

此行为的原因如下:编译器不知道它需要在堆栈上为B类实例分配多少字节,因为此信息取决于类的定义(您没有当时给出)。然而,指向B类实例的指针可以在B的前向声明之后构造,因为指针的大小是先前已知的(并且对于所有指针类型通常都是相同的)。

+0

@swegi:谢谢! – Lazer 2010-04-17 03:24:39

4

类前向声明​​正常工作;你只是没有包括一个。添加bb声明

class B; 

上方,它会工作

编辑:由于kibibu指出,除非它是一个指针,所以

B* bb; 

将不能声明不完整的类型工作,但你的方式不会。好的电话

+4

虽然你不能声明一个前向声明类的变量,对吗? (指针除外) – kibibu 2010-04-16 04:48:31

1

我不认为这行“struct t tt;”将编译。

在C++中,除了具有不同的默认访问权限外,struct和class是相同的。

1

你行:

struct t tt; 

不编译对我来说,我得到:

.\TestApp.cpp(11) : error C2079: 'tt' uses undefined struct 'main::t' 

(这是的Visual C++ 2008)