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 {};

我刚刚修改了这里给出的例子。

为什么结构前向声明有效但类前向声明​​无效?

它与命名空间有关tag namespacetypedef namespace?我知道没有 typedef 的结构定义会进入标记命名空间。

结构只是具有所有公共成员的类。所以,我希望他们表现得相似。

4

4 回答 4

9

前向声明适用于类,但您所期望的除外。首先,您必须在例程class B;的代码之前编写。main然后你必须写B * bb;而不是B bb;. 只有在类定义之后才能构造 B 类型的对象。

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

于 2010-04-16T06:21:38.337 回答
4

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

class B;

bb声明之上,它会起作用

编辑:正如kibibu指出的,你不能声明一个不完整的类型,除非它是一个指针,所以

B* bb;

会工作,但你的方式不会。好决定

于 2010-04-16T04:43:04.937 回答
1

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

在 C++ 中,结构和类是相同的,只是具有不同的默认访问权限。

于 2010-04-16T04:55:58.110 回答
1

您的线路:

struct t tt;

不为我编译,我得到:

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

(这是 Visual C++ 2008)

于 2010-04-16T05:01:44.867 回答