在main()之前注册类/函数/事物

Registering classes/functions/things before main()

本文关键字:函数 事物 注册 main      更新时间:2023-10-16

假设我有一个名为Poem的类。

class Poem{
   virtual void recite() = 0;
}

我有数百个。cpp和。hpp文件,它们描述了一个子类,就像下面的

class TheRaven : public Poem{
    void recite() { std::cout << "NEVERMORE!" << endl; }
}

之类的。在main函数中,我希望能够迭代每一个可能的Poem子类并调用它们的朗诵()函数。所以我创建了一个类:

class PoemRegistry{
    std::map<std::string, Poem*> poems;
    PoemRegistry& getGlobal(); // returns a static global registry
    void register(const std::string& poemname, Poem * thepoem);
};

然后,对于每个诗子类.cpp文件,我输入以下内容。

class TheRavenRegistor{
    TheRavenRegistor(){
        PoemRegistry::getGlobal().register("theraven", new TheRaven());
    }
}
TheRavenRegistor registor();

ninja edit:我把全局类放在那里,忘了它吧

为了方便,我用#define和templates创建了一个快捷方式

现在,问题是,我刚刚听说了静态类初始化的惨败。我想这是免疫的,还是我肯定遗漏了什么?或者有什么更优雅的东西可以用来达到这个目的?

这是一个单例设计模式的例子。不要使用静态全局变量,因为跨编译单元的初始化顺序是未定义的。你可以这样写:

PoemRegistry& PoemRegistry::getGlobal()
{
  static PoemRegistry theRegistry; // construction guaranteed when first call
  return theRegistry;
} 

创建getGlobal()方法static:

class PoemRegistry
{
public:
  static PoemRegistry& getGlobal();
...