簡體   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