为啥我不能只用前向声明 C++ 声明一个类的静态成员?
Posted
技术标签:
【中文标题】为啥我不能只用前向声明 C++ 声明一个类的静态成员?【英文标题】:Why I cannot declare an static member of a class with only a forward declaration c++?为什么我不能只用前向声明 C++ 声明一个类的静态成员? 【发布时间】:2019-10-03 18:17:30 【问题描述】:为什么我不能在不提供完整定义(包含)的情况下在类中声明静态成员?
我知道只有在没有真正使用类的成员时才能使用前向声明,例如声明指针或引用,因为编译器必须知道类型的大小并且所有指针或引用的大小都相同。但是为什么我不能这样声明一个静态成员呢?我的意思是变量不会在类的任何实例中存在,它不会加起来对象的大小,它的生命周期也不会,它会在第一次使用时被初始化。声明静态成员仅适用于程序员,只需给出名称(例如:Type::static_var)和访问修饰符,但它会像所有全局变量一样存在于程序的 .text 部分。
在代码中: 啊.h
class B;
class A
static B b;
//other stuff
B.h
class B
C c;
D d;
A.cpp
B A::b;
///whatever more
A::A()
///...
在其他地方会是这样的:
class D : A/*...*/;
class C : A/*...*/;
我知道我可以通过 #include "B.h"
轻松解决这个问题,但我不能,因为我的 B
结构有一堆从 A
继承的对象,这会导致循环包含。
我只想要一个从A
继承的每个对象的列表,以便从从A
继承的每个对象访问(我知道这听起来很乱,但在我们的项目中是有道理的,一切都在编译时解决)。
我们目前正在使用指针进行此操作,并在 main 中进行设置,但我希望它生活在 A
中,而不是全局命名空间中。
【问题讨论】:
【参考方案1】:为什么我不能在一个类中声明一个静态成员而不提供完整的定义
你可以。只要声明不是定义,语言就允许这样做。您的示例中静态成员的声明不是定义,因此没有问题。
你程序中的问题是你在定义A.cpp
中的静态成员变量之前没有定义B
。以下简化程序格式正确:
class B;
class A
static B b; // B is incomplete; this declaration is fine
;
class B; // B is now complete
B A::b; // The variable can be defined, because B is complete
它会在第一次使用时被初始化。
没有;这不是静态成员的工作方式。它们在程序启动期间在静态初始化阶段进行初始化,就像具有静态存储的命名空间变量一样。
【讨论】:
以上是关于为啥我不能只用前向声明 C++ 声明一个类的静态成员?的主要内容,如果未能解决你的问题,请参考以下文章