2012-03-08 119 views
0

在C++中,如何讓一個需要在main()中初始化的對象的最佳方式是什麼?但是必須是全局的,所以可以通過程序中的其他函數訪問它?並確保調用析構函數以確保正確清理它?C++初始化全局變量

+0

你在堆上分配對象嗎? – Adrian 2012-03-08 18:11:19

回答

4
struct foo {}; 

foo *x_ptr; 

int main() { 
    foo x; 
    x_ptr = &x; 
    // the rest 
} 

您也可以使用std::reference_wrapper如果你不想通過operator->訪問的成員。

但是真的,不要這樣做。如果需要的話傳遞,而不是使其成爲全局的,例如,

void needs_foo1(foo&); 
void needs_foo2(foo&, int, int, int); 

int main() { 
    foo x; 
    needs_foo1(x); 
    needs_foo2(x, 1, 2, 3); 
    // et cetera 
} 
+1

他說不這樣做的原因是因爲擁有一個全局變量,任何可以修改的全局變量在一個複雜的系統中變得非常危險,因爲你不知道哪個實體正在改變它;可能很難調試。 – sparkFinder 2012-03-08 18:45:13

3

我懷疑「全局」是一個解決方案,而不是一個需求。正如已經建議的,你總是可以明確地傳遞你的對象。

如果你不想這樣做,我可能會使用shared::ptr,可能包裝在Singleton實施。您的shared_ptr將在程序啓動時初始化爲null,並在main()中設置爲有效值。

請注意,如果您的全局變量依賴於其他全局變量,您可能會遇到銷燬問題的順序。還有關於Singleton模式缺點的大量文獻。

+0

是的,我無法想象全局變量是一個需求。只需製作一個並傳遞給它。明確依賴關係。 – 2012-03-08 21:38:25