亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++中的靜態構造函數?我需要初始化私有靜態對象

C ++中的靜態構造函數?我需要初始化私有靜態對象

C++
幕布斯6054654 2019-10-15 10:24:57
我想要一個帶有私有靜態數據成員(包含所有字符az的向量)的類。在Java或C#中,我可以創建一個“靜態構造函數”,該靜態構造函數將在創建該類的任何實例之前運行,并設置該類的靜態數據成員。它只運行一次(因為變量是只讀的,只需要設置一次),并且由于它是類的函數,因此可以訪問其私有成員。我可以在構造函數中添加代碼,以檢查向量是否已初始化,如果尚未初始化,則將其初始化,但這會引入許多必要的檢查,而且似乎不是解決問題的最佳方法。我想到,由于變量將是只讀的,因此它們只能是公共靜態const,因此我可以在類外設置它們一次,但是再一次,這看起來像是一個丑陋的hack。如果我不想在實例構造函數中初始化私有靜態數據成員,是否可以在類中擁有私有靜態數據成員?
查看完整描述

3 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

要獲得與靜態構造函數等效的功能,您需要編寫一個單獨的普通類來保存靜態數據,然后創建該普通類的靜態實例。


class StaticStuff

{

     std::vector<char> letters_;


public:

     StaticStuff()

     {

         for (char c = 'a'; c <= 'z'; c++)

             letters_.push_back(c);

     }


     // provide some way to get at letters_

};


class Elsewhere

{

    static StaticStuff staticStuff; // constructor runs once, single instance


};


查看完整回答
反對 回復 2019-10-15
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

好吧,你可以擁有


class MyClass

{

    public:

        static vector<char> a;


        static class _init

        {

          public:

            _init() { for(char i='a'; i<='z'; i++) a.push_back(i); }

        } _initializer;

};

不要忘了(在.cpp中):


vector<char> MyClass::a;

MyClass::_init MyClass::_initializer;

該程序仍將鏈接而沒有第二行,但是將不執行初始化程序。


查看完整回答
反對 回復 2019-10-15
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

C ++ 11解決方案

從C ++ 11開始,您可以簡單地使用lambda表達式初始化靜態類成員。如果您需要在各個靜態成員之間強加一個構造順序,或者如果您具有靜態成員,那么這甚至可以工作const。


頭文件:


class MyClass {

    static const vector<char> letters;

    static const size_t letterCount;

};

源文件:


// Initialize MyClass::letters by using a lambda expression.

const vector<char> MyClass::letters = [] {

    vector<char> letters;

    for (char c = 'a'; c <= 'z'; c++)

        letters.push_back(c);

    return letters;

}();


// The initialization order of static members is defined by the order of

// definition within the source file, so we can access MyClass::letters here.

const size_t MyClass::letterCount = letters.size();


查看完整回答
反對 回復 2019-10-15
  • 3 回答
  • 0 關注
  • 605 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號