1

我有一个工厂类来注册一个类型

class Factory
{
public:
    template<class T>
    static void regist()
    {
        mMap[T::type()] = [](){return new T();};
    }

    static Base* create(string type)
    {
       ... // use map to find the function to create a new object
    }

private:
    static map<string, function<Base* ()>> mMap;
};

map<string, function<Base* ()>> Factory::mMap;

和 Base 的具体类 T

class A : public Base
{
public:
    static string type() { return "A"; }
    static bool sRegist;
    A() {}

};

bool A::sRegist = []() -> bool {
    Factory::regist<A>();
    return true;
}();

但是,代码在运行时会崩溃。我认为这是由于静态成员的不确定初始化顺序。如何使它起作用?谢谢。

4

1 回答 1

1

放置mMap在静态函数中,如下所示:

class Factory
{
public:
  template<class T>
  static void regist()
  {
    getMap()[T::type()] = [](){return new T();};
  }

  // ...

private:
  static map<string, function<Base* ()>>& getMap() {
    static map<string, function<Base* ()>> mMap;
    return mMap;
  }
};

在这种情况下mMap,一旦函数被调用,就会被初始化。

于 2013-10-12T19:37:55.757 回答