为啥我不能只用前向声明 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++ 声明一个类的静态成员?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中嵌套类型/类的前向声明

为啥 C++ 友元类只需要在其他命名空间中进行前向声明?

为啥我不能使用双冒号在命名空间中前向声明一个类?

为啥不能对 std::vector 使用前向声明?

C++ 类的前向声明的用法

不允许嵌套类的前向声明的原因?