C ++ - 如何在成员函数内初始化静态变量?

时间:2011-03-23 03:48:19

标签: c++

void ClassA::Func()
{
    static map<int, string> mapIntStr;

    mapIntStr[0] = m_memberVariable0; <= just want to do once & m_memberVariable* are not static
    mapIntStr[1] = m_memberVariable1; <= just want to do once
    ...
}

我只想初始化变量mapIntStr一次。我们知道,我们可以将初始化代码放在静态函数中并调用该静态函数并将返回值存储到mapIntStr中。

在这里,我想快速获得一个&amp;肮脏的解决我记得有一种叫做静态范围的东西。我想在不调用静态函数的情况下初始化mapIntStr ONCE。我怎么能这样做?

谢谢

2 个答案:

答案 0 :(得分:6)

void ClassA::Func()
{
    static map<int, string> mapIntStr;

    if(mapIntStr.empty()){
      mapIntStr[0] = m_memberVariable0;
      mapIntStr[1] = m_memberVariable1;
      // ...
    }
}

怎么样? :)
修改
那么,最好的解决方案是将mapIntStr从函数中取出并放入类中。然后你就不会绕过静态函数调用。

//in ClassA.h
class ClassA{
public:
  void Func();

  static map<int,string> InitStatic();
  static map<int,string> mapIntStr;
};

//in ClassA.cpp
#include "ClassA.h"
void ClassA::Func(){
  // use mapIntStr
}

map<int,string> ClassA::InitStatic(){
  map<int,string> ret;
  // init ret
  return ret;
}

map<int,string> ClassA::mapIntStr = ClassA::InitStatic();

这是我所知道的唯一选择。所以你有了选择。在func中初始化一次映射,或者在第一次创建ClassA对象时在一个构造函数中初始化(两者的更好版本),并且接受对empty()的近乎noop调用的开销。很可能只有在正确的内联之后才是单个指令,并且不会产生任何开销,或者使用静态初始化函数。

答案 1 :(得分:1)

创建一个内部结构,然后初始化该结构的构造函数中的所有内容,然后声明该结构的静态变量。

void fun()
{
    struct setter
    {
         setter(){}
    };

    static setter setup;
}

对于你的情况:

void ClassA::Func()
{
     struct Map : public std::map<int, string>
     {
          Map()
          {
              (*this)[0] = something;
              (*this)[1] = somethingElse;
          }
     }
     static Map map;
}