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

C++ 嵌套类的静态对象可以在没有类定义的情况下声明,c++,static,nested-class,C++,Static,Nested Class,除非已定义类,否则无法声明类的静态对象 例如..由于未定义类C,以下代码无法编译 class C; int main() { static C y; } 但是,为什么即使尚未定义类B,仍要编译以下代码 class A { class B; static B x; }; 在第一种情况下(在main函数中),定义了对象y,因此需要类定义 在第二种情况下(在类A中),只声明成员x——通常需要在.cpp文件中定义它。就其定义而言,需要定义C,但不是静态成员声明。在第一种情况下

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

例如..由于未定义类C,以下代码无法编译

class C;
int main()
{
    static C y;
}
但是,为什么即使尚未定义类B,仍要编译以下代码

class A
{
    class B;
    static B x;
};
在第一种情况下(在
main
函数中),定义了对象
y
,因此需要类定义

在第二种情况下(在类
A
中),只声明成员
x
——通常需要在.cpp文件中定义它。就其定义而言,需要定义
C
,但不是静态成员声明。

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

在第二种情况下(在类
A
中),只声明成员
x
——通常需要在.cpp文件中定义它。就其定义而言,需要定义
C
,但不是静态成员声明。

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

在第二种情况下(在类
A
中),只声明成员
x
——通常需要在.cpp文件中定义它。就其定义而言,需要定义
C
,但不是静态成员声明。

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


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

区别不在于一个类是内部类,另一个不是。区别在于
static
在类范围和函数范围中的含义不同

在类范围中,它意味着一个类范围(不是每个实例)的成员,该行是一个声明。您需要在类主体之外有一个单独的定义:

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

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

区别不在于一个类是内部类,另一个不是。区别在于
static
在类范围和函数范围中的含义不同

在类范围中,它意味着一个类范围(不是每个实例)的成员,该行是一个声明。您需要在类主体之外有一个单独的定义:

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

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

区别不在于一个类是内部类,另一个不是。区别在于
static
在类范围和函数范围中的含义不同

在类范围中,它意味着一个类范围(不是每个实例)的成员,该行是一个声明。您需要在类主体之外有一个单独的定义:

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

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

区别不在于一个类是内部类,另一个不是。区别在于
static
在类范围和函数范围中的含义不同

在类范围中,它意味着一个类范围(不是每个实例)的成员,该行是一个声明。您需要在类主体之外有一个单独的定义:

A::B A::x; // B must be complete here, and you can add an initializer
在函数范围中,它是静态存储持续时间的局部变量,这意味着它将在函数调用中保留其值。行本身是一个定义,而不仅仅是一个声明,因此它需要完整的类型

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

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

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

class C;
int main()
{
    static C y;
}
实际上,它试图定义一个局部变量,这需要类定义

但是,为什么即使尚未定义类B,仍要编译以下代码

class A
{
    class B;
    static B x;
};
因为您只声明了静态变量。要使用该变量,它还需要一个定义(只有一个,通常在源文件中)

并且该类型在该点必须是完整的(即定义的)

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

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

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

class C;
int main()
{
    static C y;
}
实际上,它试图定义一个局部变量,这需要类定义

但是,为什么即使尚未定义类B,仍要编译以下代码

class A
{
    class B;
    static B x;
};
因为您只声明了静态变量。要使用该变量,它还需要一个定义(只有一个,通常在源文件中)

并且该类型在该点必须是完整的(即定义的)

无法声明类的静态对象