【发布时间】: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
除非已定义类,否则不能声明类的静态对象...
例如..以下代码无法编译,因为尚未定义类 C....
class C;
int main()
{
static C y;
}
但是为什么在没有定义B类的情况下,下面的代码还是可以编译??
class A
{
class B;
static B x;
};
【问题讨论】:
标签: c++ static nested-class
在第一种情况下(在main 函数中)定义了对象y - 所以需要类定义。
在第二种情况下(在A 类中)成员x 只被声明——它需要在.cpp 文件中正常定义。在其定义中,C 的定义将是必需的,但它不适用于静态成员声明。
【讨论】:
x 被声明为非静态成员,则不会编译,因为非静态成员在类范围内定义,而不是只是声明。
区别不在于一个类是内部类而另一个不是。区别在于static在类作用域和函数作用域上的含义不同。
在类范围内,它表示一个类范围(不是每个实例)的成员,并且该行是一个声明。您需要在类主体之外单独定义:
A::B A::x; // B must be complete here, and you can add an initializer
在函数范围内,它是静态存储持续时间的局部变量,这意味着它将在函数调用之间保持其值。该行本身就是一个定义,而不仅仅是一个声明,所以它需要完整的类型。
【讨论】:
除非已定义类,否则不能声明类的静态对象...
不完全是。它不能被定义(或实例化,如果你喜欢的话),除非类已经被定义(完整类型也是如此);只要已声明类,它就可以声明(但可能是不完整类型,尚未定义)。
以下代码无法编译,因为尚未定义 C 类....
确实,它试图定义一个局部变量,这需要类定义。
但是为什么在没有定义B类的情况下,下面的代码还是能编译??
因为您只声明了静态变量。要使用该变量,它还需要一个定义(确切地说,通常在源文件中)
A::B A::x;
并且此时类型必须是完整的(即已定义)。
【讨论】: