可以在没有类定义的情况下声明嵌套类的静态对象

时间:2015-01-14 13:00:25

标签: c++ static nested-class

除非已定义类,否则无法声明类的静态对象...

例如..以下代码无法编译,因为C类尚未定义....

class C;
int main()
{
    static C y;
}

但是为什么即使B类尚未定义,下面的代码也会编译?

class A
{
    class B;
    static B x;
};

3 个答案:

答案 0 :(得分:1)

在第一种情况下(在main函数中)定义了对象y - 因此需要类定义。

在第二种情况下(在类A中),成员x仅被声明 - 它通常需要在.cpp文件中正常定义。在其定义方面,C的定义将是必需的,但它不适用于静态成员声明。

答案 1 :(得分:1)

不同之处在于,一个班级是内部班级而另一个班级不是。区别在于static意味着类范围和功能范围不同。

在类范围中,它表示一个类范围(不是每个实例)成员,该行是声明。在类体外需要一个单独的定义:

A::B A::x; // B must be complete here, and you can add an initializer

在函数范围内,它是静态存储持续时间的局部变量,这意味着它将在函数调用中保留其值。该行本身就是一个定义,而不仅仅是一个声明,所以它需要完整的类型。

答案 2 :(得分:1)

  

除非已定义类,否则无法声明类的静态对象...

不完全。它不能定义(或实例化,如果你愿意),除非已经定义了类(因此完整类型);只要声明了类(但可能是不完整类型,尚未定义),它就可以声明

  

以下代码无法编译,因为C类尚未定义....

实际上,它试图定义一个局部变量,它需要类定义。

  

但是为什么即使B类尚未定义,下面的代码也会编译?

因为你只声明了静态变量。要使用该变量,它还需要一个定义(恰好一个,通常在源文件中)

A::B A::x;

并且该类型必须在那时完成(即定义)。