3 回答

TA貢獻1772條經驗 獲得超8個贊
靜態對象以相反的順序破壞。而且施工順序很難控制。您唯一可以確定的是,將按定義順序構造在同一編譯單元中定義的兩個對象。其他任何事物或多或少都是隨機的。

TA貢獻2016條經驗 獲得超9個贊
對此的其他答案堅持認為它無法完成。他們是對的,依據規范-但有是一招,可以讓你做到這一點。
僅創建一個單一的靜態變量,它包含了所有其他的事情,你通常會做靜態變量,像這樣一類或結構的,:
class StaticVariables {
public:
StaticVariables(): pvar1(new Var1Type), pvar2(new Var2Type) { };
~StaticVariables();
Var1Type *pvar1;
Var2Type *pvar2;
};
static StaticVariables svars;
您可以按所需的順序創建變量,更重要的是,可以按所需的順序破壞變量,方法是在的構造函數和析構函數中StaticVariables。為了使其完全透明,您也可以創建對變量的靜態引用,如下所示:
static Var1Type &var1(*svars.var1);
Voilà-完全控制。:-)也就是說,這是額外的工作,通常是不必要的。但是,當有必要時,了解它非常有用。

TA貢獻1801條經驗 獲得超8個贊
靜態對象的破壞順序與生成它們的順序相反(例如,第一個破壞的對象最后被破壞),您可以使用第47條中所述的技術來控制靜態對象的生成順序,在Meyers的書《Effective C ++》中“ 確保在使用全局對象之前對其進行了初始化 ” 。
例如,以某種方式指定我希望某個對象最后被破壞,或者至少在另一個靜態注入之后被破壞?
確保在其他靜態對象之前構造它。
如何控制施工順序?并非所有的靜態函數都在同一個dll中。
為了簡單起見,我將忽略它們不在同一個DLL中的事實。
我對邁耶斯項目47(長4頁)的解釋如下。假設您在這樣的頭文件中定義了全局變量...
//GlobalA.h
extern GlobalA globalA; //declare a global
...向這樣的包含文件添加一些代碼...
//GlobalA.h
extern GlobalA globalA; //declare a global
class InitA
{
static int refCount;
public:
InitA();
~InitA();
};
static InitA initA;
這樣做的結果是,任何包含GlobalA.h的文件(例如,定義了第二個全局變量的GlobalB.cpp源文件)都將定義InitA類的靜態實例,該實例將在該實例中的其他任何對象之前進行構造源文件(例如,在第二個全局變量之前)。
該InitA類具有靜態引用計數器。當構造第一個InitA實例時(現在可以保證在構造GlobalB實例之前),InitA構造函數可以執行其必須做的一切以確保初始化globalA實例。
- 3 回答
- 0 關注
- 771 瀏覽
添加回答
舉報