3 回答

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

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

TA貢獻(xiàn)1801條經(jīng)驗 獲得超8個贊
靜態(tài)對象的破壞順序與生成它們的順序相反(例如,第一個破壞的對象最后被破壞),您可以使用第47條中所述的技術(shù)來控制靜態(tài)對象的生成順序,在Meyers的書《Effective C ++》中“ 確保在使用全局對象之前對其進(jìn)行了初始化 ” 。
例如,以某種方式指定我希望某個對象最后被破壞,或者至少在另一個靜態(tài)注入之后被破壞?
確保在其他靜態(tài)對象之前構(gòu)造它。
如何控制施工順序?并非所有的靜態(tài)函數(shù)都在同一個dll中。
為了簡單起見,我將忽略它們不在同一個DLL中的事實。
我對邁耶斯項目47(長4頁)的解釋如下。假設(shè)您在這樣的頭文件中定義了全局變量...
//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;
這樣做的結(jié)果是,任何包含GlobalA.h的文件(例如,定義了第二個全局變量的GlobalB.cpp源文件)都將定義InitA類的靜態(tài)實例,該實例將在該實例中的其他任何對象之前進(jìn)行構(gòu)造源文件(例如,在第二個全局變量之前)。
該InitA類具有靜態(tài)引用計數(shù)器。當(dāng)構(gòu)造第一個InitA實例時(現(xiàn)在可以保證在構(gòu)造GlobalB實例之前),InitA構(gòu)造函數(shù)可以執(zhí)行其必須做的一切以確保初始化globalA實例。
- 3 回答
- 0 關(guān)注
- 772 瀏覽
添加回答
舉報