除非已定义类,否则无法声明类的静态对象...
例如..以下代码无法编译,因为C类尚未定义....
class C;
int main()
{
static C y;
}
但是为什么即使B类尚未定义,下面的代码也会编译?
class A
{
class B;
static B x;
};
答案 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;
并且该类型必须在那时完成(即定义)。