静态地图初始化(static map initialization)

2019-07-03 23:21发布

我有以下代码:我有以下代码:

//MyClass.h
class MyClass {
public:
      typedef std::map<std::string, int> OpMap;
      static OpMap opMap_;


     //methods
};

//MyClass.cpp
//Init opMap_
MyClass::opMap_["x"] = 1; //compilation error

我哪有什么情况下初始化(静态)opMap_?

Answer 1:

如果您使用C ++ 11,你可以使用初始化列表:

//MyClass.h
class MyClass {
public:
      typedef std::map<std::string, int> OpMap;
      static OpMap opMap_;
};

//MyClass.cpp
MyClass::OpMap MyClass::opMap_ = { 
    { "x", 1 }
}; 

如果您没有访问到支持C ++ 11标准的编译器,你可以做到以下几点:

//MyClass.h
class MyClass {
public:
      typedef std::map<std::string, int> OpMap;
      static OpMap opMap_;
private:
      static OpMap init_map() {
          OpMap some_map;
          some_map["x"] = 1;
          return some_map;
      }
};

//MyClass.cpp
MyClass::OpMap MyClass::opMap_ = init_map();


Answer 2:

当你正在使用VS2010,你需要初始化MyClass.cpp你的静态成员,在任何其他成员函数定义前。 调用MyClass::InitMap()如果你想初始化opMap_

MyClass.h

class MyClass
{
public:
  MyClass(void);
  ~MyClass(void);
public:
   typedef std::map<std::string, int> OpMap;
   static OpMap opMap_;    
   static void InitMap();
};

MyClass.cpp

std::map<std::string, int> MyClass::opMap_;
MyClass::MyClass(void)
{
   InitMap(); // just sample if you want to initialize opMap_ inside MyClass constructor
}

void InitMap()
{
  MyClass::opMap_["x"] = 1;
}


文章来源: static map initialization
标签: c++ map static