【问题标题】:Static objects of nested class can be declared without class definition嵌套类的静态对象可以在没有类定义的情况下声明
【发布时间】:2015-01-14 13:00:25
【问题描述】:

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

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

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

但是为什么在没有定义B类的情况下,下面的代码还是可以编译??

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

【问题讨论】:

    标签: c++ static nested-class


    【解决方案1】:

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

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

    【讨论】:

    • 为了扩展这一点,如果 x 被声明为非静态成员,则不会编译,因为非静态成员在类范围内定义,而不是只是声明。
    【解决方案2】:

    区别不在于一个类是内部类而另一个不是。区别在于static在类作用域和函数作用域上的含义不同。

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

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

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

    【讨论】:

      【解决方案3】:

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

      不完全是。它不能被定义(或实例化,如果你喜欢的话),除非类已经被定义(完整类型也是如此);只要已声明类,它就可以声明(但可能是不完整类型,尚未定义)。

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

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

      但是为什么在没有定义B类的情况下,下面的代码还是能编译??

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

      A::B A::x;
      

      并且此时类型必须是完整的(即已定义)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多