为什么前向声明不适用于类?

时间:2010-04-16 04:37:42

标签: c++ class structure 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 {};

我刚修改了给定here的示例。

为什么结构转发声明有效但不是类前向声明​​?

是否与命名空间有关 - tag namespacetypedef namespace?我知道没有typedef的结构定义会转到标记命名空间。

结构只是包含所有公共成员的类。所以,我希望它们的行为类似。

4 个答案:

答案 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)