2011-03-23 106 views
0
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中。C++ - 如何初始化成员函数内的静态变量?

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

谢谢

+2

是否有任何具体的原因,这不是一个静态成员变量? – littleadv 2011-03-23 03:50:52

回答

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

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

怎么样? :)
编辑
那么,最好的解决方案将采取出功能和类。然后你不会绕过静态函数调用。

//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中甚至在构造器中初始化映射(两者的更好版本),并接受empty()的近似noop调用的开销,这将极有可能是仅在适当的内联,并且不会带来任何开销,或者使用静态初始化函数。

+0

这不是最好的解决方案b/c CPU会浪费时间来检查条件 - 谢谢 – q0987 2011-03-23 03:52:44

+0

当然,那么最好的解决方案将是别的,brb,编辑它。 – Xeo 2011-03-23 03:53:52

+0

@ q0987更新。 – Xeo 2011-03-23 04:01:33

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

这是我在这样的情况下使用的方法。你开始用下面的类:

#include <functional> 

class block 
{ 
public: 
    block(std::function<void()> func) 
    { 
    func(); 
    } 
}; 

这是一个非常原始和轻量级类,但它让你做这样的事情:

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

    static block init_mapIntStr 
    { 
    []() 
    { 
     // Everything inside this block is called only once. 
     mapIntStr[0] = m_memberVariable0; 
     mapIntStr[1] = m_memberVariable1; 
    } 
    } 

    ... 

这可能不是很漂亮给大家,但它作品。而且,这个块类是相当可重用的。