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

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

C ++靜態初始化順序

C ++靜態初始化順序

C++
繁星coding 2019-07-30 16:55:16
C ++靜態初始化順序當我在C ++中使用靜態變量時,我常常想要初始化一個變量,將另一個變量傳遞給它的構造函數。換句話說,我想創建彼此依賴的靜態實例。在單個.cpp或.h文件中,這不是問題:將按照聲明的順序創建實例。但是,如果要使用另一個編譯單元中的實例初始化靜態實例,則無法指定順序。結果是,根據天氣,可能會發生構建依賴于另一個實例的實例,并且之后才構建另一個實例。結果是第一個實例初始化不正確。有誰知道如何確保以正確的順序創建靜態對象?我已經搜索了很長時間尋找解決方案,嘗試了所有這些解決方案(包括Schwarz Counter解決方案),但我開始懷疑有一個確實有效。一種可能性是使用靜態函數成員的技巧:Type& globalObject(){     static Type theOneAndOnlyInstance;     return theOneAndOnlyInstance;}實際上,這確實有效。遺憾的是,您必須編寫globalObject()。MemberFunction()而不是globalObject.MemberFunction(),從而導致一些令人困惑和不雅的客戶端代碼。更新:感謝您的反應。遺憾的是,我確實似乎回答了自己的問題。我想我必須學會忍受它......
查看完整描述

3 回答

?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

也許您應該重新考慮是否需要這么多全局靜態變量。雖然它們有時可能很有用,但通常將它們重構到較小的局部范圍要簡單得多,尤其是當您發現某些靜態變量依賴于其他變量時。

但是你是對的,沒有辦法確保特定的初始化順序,所以如果你的心被設置在它上面,那么像你提到的那樣在函數中保持初始化可能是最簡單的方法。


查看完整回答
反對 回復 2019-07-30
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

實際上,這確實有效。遺憾的是,您必須編寫globalObject()。MemberFunction()而不是globalObject.MemberFunction(),從而導致一些令人困惑和不雅的客戶端代碼。

但最重要的是它有效,而且它是失敗證明,即。繞過正確的用法并不容易。

程序正確性應該是您的首要任務。另外,恕我直言,上面的()是純粹的風格 - 即。完全不重要。

根據您的平臺,請注意過多的動態初始化。動態初始化器可以進行相對少量的清理(參見此處)。您可以使用包含不同全局對象成員的全局對象容器來解決此問題。你因此:

Globals & getGlobals (){
  static Globals cache;
  return cache;}

只有一次調用~Globals()來清理程序中的所有全局對象。要訪問全局,您仍然可以使用以下內容:

getGlobals().configuration.memberFunction ();

如果你真的想要你可以將它包裝在宏中以使用宏保存一點點輸入:

#define GLOBAL(X) getGlobals().#X
GLOBAL(object).memberFunction ();

雖然,這只是初始解決方案的語法糖。


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 522 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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