静态映射初始化

Static map initialization

提问人:YAKOVM 提问时间:11/20/2012 最后编辑:YunYAKOVM 更新时间:10/21/2021 访问量:83326

问:

我有以下代码:

//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++ 静态 标准映射

评论

1赞 Syntactic Fructose 11/20/2012
你得到的编译错误是什么?
0赞 didierc 11/20/2012
看到那个 SO 问题
0赞 YAKOVM 11/20/2012
@Need4Sleep:在VS10上,我得到“错误C2057:预期的常量表达式”,“错误C2466:无法分配常量大小为0的数组”
0赞 YAKOVM 11/20/2012
@didierc - 我看到了。它没有帮助
0赞 Mr.C64 11/20/2012
@Yakov:这是这个问题的新版本吗?

答:

46赞 mfontanini 11/20/2012 #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++ 标准的编译器,则可以执行以下操作:

//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();

评论

0赞 YAKOVM 11/20/2012
@mfontanini : 我知道,但我用的是VS10
0赞 YAKOVM 11/20/2012
@mfontanini : 好的,谢谢 - 我知道我需要一种初始化映射。你能指导我关于功能内容吗?
1赞 mfontanini 11/20/2012
@Yakov它基本上会创建一个本地映射,用你想要的东西初始化它,然后按值返回它。然后,使用调用该函数的结果初始化静态成员。opMap_
0赞 Behroz Sikander 1/22/2016
以防万一,有人想初始化一个空地图 -> stackoverflow.com/questions/11247407/......
0赞 yano 6/7/2019
谢谢。。。在某些项目上仍然必须使用 C++98,SMH
5赞 billz 11/20/2012 #2

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

我的课堂.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;
}

评论

0赞 YAKOVM 11/20/2012
目前尚不清楚。请提供更多详情。你写的东西看起来像我在 MyClass.h 中已经有的声明
1赞 billz 11/20/2012
这很清楚。它是静态成员的定义,它调用默认的 std::map 构造函数。在 MyClass.h 中,它是静态成员声明而不是定义。
0赞 YAKOVM 11/20/2012
@bills - 好的,我明白了。但即使我做 std::map<std::string, int> MyClass::opMap_;并立即想要初始化omMap_ : MyClass::opMap_[“x”] = 1;我收到相同的编译错误
0赞 billz 11/20/2012
您需要在函数内部进行操作。查看我更新的答案
4赞 mfontanini 11/20/2012
这是一个糟糕的解决方案。每次构造对象时,您都会初始化地图。MyClass
3赞 docp 10/21/2021 #3

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

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

评论

1赞 AppDeveloper 12/20/2021
inline,最短的解决方案,这个答案应该在顶部。