静态/全局对象的创建顺序

时间:2014-07-11 15:49:21

标签: c++

在我的应用程序中,有2个全局对象。一个对象的构造函数,它访问另一个,假设它已经创建。幸运的是,我的应用程序运行正常了一段时间。但是由于最近cpp文件和编译顺序的变化,我发现全局对象创建顺序已经从我的应用程序预期改变了。

所以,我的问题是,

有没有办法控制全局对象的创建顺序。我认为静态对象也应该存在同样的问题。根据我的试用版,我发现链接顺序或“o”文件会改变这一点。但这是对的吗?难道没有正确的方法吗?

3 个答案:

答案 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;