2016-03-15 78 views
0

我想要一個全局列表,當兼容類鏈接到可執行文件時,這些對象會自動填充。我已經想出了一種方法,但當'兼容類'被放入庫時它不起作用。使用函數從庫中返回一個靜態對象

該列表顯然應該在使用前初始化,所以我把它作爲一個函數的靜態變量。 例如,我有file1.cpp如下:

vector<int>& getGlobalReg() { 
    static vector<int> __globalReg; 
    return __globalReg; 
} 

頭file1.h定義訪問該FUNC:

vector<int>& getGlobalReg(); 

的對象(在這種情況下的整數)將被自動註冊由一個鏈接的file2.cpp例如如下:

class Compatible { 
public: 
    Compatible() { 
    getGlobalReg().push_back(2); 
    } 
}; 
Compatible __auto_reg; 

當所有這一切聯繫在一起,一切都好。當將lib1和file2.cpp中的file1.cpp放入lib2(使用lib1)時,使用lib2的可執行文件會發現getGlobalReg()爲空。在g ++和MSVC 2013中觀察它。

這是在「全局列表」中自動註冊對象的正確方法嗎?它可以修改爲在建議的鏈接方案中工作,並且相應的鏈接規則在哪裏定義?

+0

什麼樣的圖書館 –

+0

如果您發佈MCVE,會更好。例如,也許'main()'發現'getGlobalReg()。empty()'true,因爲你從來沒有創建過一個Compatible對象。我們無法從您發佈的內容中對此進行說明。 –

+0

您可以:file2.cpp的最後一行初始化Compatible類的靜態對象。一個MCVE可以通過添加一個main.cpp來構造,其中包含一個main.cpp int main(){0} {「全局對象列表的大小:」<< getGlobalReg()。size()<< endl; return 0; } – glebB

回答