2012-03-08 142 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