静态映射初始化

Static map initialization

本文关键字:初始化 映射 静态      更新时间:2023-10-16

我有以下代码:

//MyClass.h
class MyClass {
public:
    typedef std::map<std::string, int> OpMap;
    static OpMap opMap_;     
    // (more methods)
};
//MyClass.cpp
//Init opMap_
MyClass::opMap_["x"] = 1; //compilation error

如何(静态)初始化opMap_

如果您使用的是 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();

使用 VS2010 时,需要在 MyClass.cpp 中初始化静态成员,在任何其他成员函数定义之前。 如果要初始化opMap_,请调用MyClass::InitMap()

MyClass.h

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

我的班级.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;
}

在 C++ 17 中,您可以添加内联

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