在我的应用程序中,有2个全局对象。一个对象的构造函数,它访问另一个,假设它已经创建。幸运的是,我的应用程序运行正常了一段时间。但是由于最近cpp文件和编译顺序的变化,我发现全局对象创建顺序已经从我的应用程序预期改变了。
所以,我的问题是,
有没有办法控制全局对象的创建顺序。我认为静态对象也应该存在同样的问题。根据我的试用版,我发现链接顺序或“o”文件会改变这一点。但这是对的吗?难道没有正确的方法吗?
答案 0 :(得分:4)
忽略全局变量不是一个好主意的事实,您可以将对象包装在函数内部。这样,它们会在首次访问时创建,让您可以控制创建顺序:
Foo& get_foo()
{
static Foo f;
return f;
};
Bar& get_bar()
{
static Bar b(get_foo());
return b;
}
使用示例:
int main() {
Bar& b = get_bar();
return 0;
}
答案 1 :(得分:1)
一种很好的可维护方法是创建指向这些对象的全局指针,并以所需顺序将它们分配到单个函数(例如main()或其他地方)中。如果你是做“懒惰评估”而只是简单地让对象在访问时创建,那么它们的顺序就不那么明显了,因此维护性较差。
这当然意味着如果没有初始化你将有空指针。
如果A的ctor必须使用对象B,则A应断言B不为空。
(编辑:这并不是说lazy-evalutaion没有它的位置,但对于这种情况,我个人会用指针)
答案 2 :(得分:-1)
查看Singleton模式(从yolinux复制)。那里有一些变化,但是想法是在通过Instance()
访问类的第一次使用时指定创建,然后用它来访问代码中其他任何地方的类的唯一实例
class Singleton{
public:
static Logger* Instance(){
if(!m_pInstance) return new Singleton;
return m_pInstance;
}
private:
Singleton(){}; // Private so that it can not be called
Singleton(Singleton const&){}; // copy constructor is private
Singleton& operator=(Singleton const&){}; // assignment operator is private
static Singleton* m_pInstance;
};
此部分应该超出标题(最好在正文文件中):
Singleton::Singleton* m_pInstance = NULL;