C++ 如何确保静态方法/属性先于其他类中的所有其他静态属性运行

C++ 如何确保静态方法/属性先于其他类中的所有其他静态属性运行,c++,C++,我的项目中有一些具有静态属性的类。如何创建一个静态方法来填充这些静态属性从中读取数据的容器。如何使一个静态方法在任何其他静态方法之前先运行。如何首先加载哪些类的静态属性?典型的方法是将静态对象包装在getter函数中,以便在首次使用之前不会创建它 这样,顺序由程序的设计决定 该计划的一个例子如下: class MyClass { public: static MyContainer& GetTheContainer() { static MyCo

我的项目中有一些具有静态属性的类。如何创建一个静态方法来填充这些静态属性从中读取数据的容器。如何使一个静态方法在任何其他静态方法之前先运行。如何首先加载哪些类的静态属性?典型的方法是将静态对象包装在getter函数中,以便在首次使用之前不会创建它

这样,顺序由程序的设计决定

该计划的一个例子如下:

class MyClass {
   public:
     static
     MyContainer& GetTheContainer() {
        static MyContainer* fgCon = new MyContainer; // happens at first demand
        return *fgCon; // happens whenever MyClass::GetTheContainer() is called
     }

     static
     SomeObj& GetFromContainerAt(const int i) {
        MyContainer& c = GetTheContainer();
        return c.At(i);
     }
};
其余部分取决于程序的设计。您可以让其他类填充容器——只要它们使用
GetTheContainer
,您就可以确保首先创建容器。或者,您可以通过检查容器是否为空(如果您确定它只有在创建时才会为空)或使用标记系统在容器创建时填充容器:

     MyContainer& GetTheContainer() {
        static MyContainer* fgCon = new MyContainer; // happens at first demand
        static bool isNew = true; // only true the first time
        if (isNew) {
           // fill the container
           isNew = false;
        }
        return *fgCon; // happens whenever MyClass::GetTheContainer() is called
     }

例如,您可以在上阅读有关此方案的更多信息。

请注意,即使您有一堆已经直接使用某个静态对象的代码,也可以使用此方案。只需找到声明静态对象的位置,将其替换为上面所述的getter,然后使用ldobject变量
#define(GetTheStaticObject())即可。这样,所有对象都被预编译器替换为getter。我以前用过这个把戏,觉得很方便!交换#define中的标记-它应该是#define theOldObjectVariable(GetTheStaticObject()),但我讨厌通过预解析器悄悄地修改代码。啊,你说得对,谢谢!不过,现在编辑评论已经太晚了。(至于预编译器——我不想太鼓吹它,但它可能比编辑数百个文件更容易…)