繁体   English   中英

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

[英]C++ — how to initialize the static variable inside a member function?

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中。

在这里,我想得到一个快速而肮脏的解决方案。 我记得有一种叫做静态作用域的东西。 我想在不调用静态函数的情况下初始化mapIntStr ONCE。 我该怎么做?

谢谢

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

那是我所知道的唯一选择。 因此,您可以选择。 首次创建ClassA对象(这是两个版本的更好版本)时,首先在函数中或什至在构造器中初始化地图,并以几乎没有操作的方式调用empty() ,这很可能是一条指令仅在适当的内联之后,才不会增加任何开销,或使用静态初始化函数。

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM