C++ 嵌套类的静态对象可以在没有类定义的情况下声明
除非已定义类,否则无法声明类的静态对象 例如..由于未定义类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,但不是静态成员声明。在第一种情况下
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;
};
因为您只声明了静态变量。要使用该变量,它还需要一个定义(只有一个,通常在源文件中)
并且该类型在该点必须是完整的(即定义的)
无法声明类的静态对象