设为首页 加入收藏

TOP

C++中全局对象的初始化顺序(一)
2013-09-26 19:50:47 来源: 作者: 【 】 浏览:207
Tags:全局 对象 初始 顺序

  在stackoverflow上看到下面这样一个问题:

  这个问题很简单,意思就是两个全局不同类的instance,其中一个依赖另一个,怎么确保他们的构造顺序。也就是说O2依赖于o1,o2被实例化之前,我们要确保o1一定要被构造出来,或者说初始化。就上面来看,如果这样两个全局变量o1和o2在同一个编译单元,说白了就是在同一个cpp文件里,那么编译器会保证按照他们出现的顺序初始化。但是如果这样两个全局变量在不同的编译单元呢,这时候情况比较复杂了,编译器已经不能控制他们的构造顺序了,我们需要自己想办法确定他们的构造顺序,因为编译器不能定义不同编译单元全局变量的初始化顺序。下面是我的sample code, 这两个全局变量分别在不同的编译单元,请看代码:

  //************Independent.h*************************

  #ifndef INDEPENDENT_H

  #define INDEPENDENT_H

  class Independent

  {

  public:

  Independent();

  virtual ~Independent();

  protected:

  private:

  };

  #endif // INDEPENDENT_H

  //**********************Independent.cpp*******************************

  #include "Independent.h"

  #include <iostream>

  using namespace std;

  Independent::Independent()

  {

  cout《"Independent::Independent()。"《endl;

  }

  Independent::~Independent()

  {

  cout《"Independent::~Independent()。"《endl;

  }

  Independent o1;

  //*********************Dependent.h*****************************

  #ifndef DEPENDENT_H

  #define DEPENDENT_H

  #include "Independent.h"

  class Dependent

  {

  public:

  virtual ~Dependent();

  Dependent();

  protected:

  private:

  };

  #endif // DEPENDENT_H

  //***********************Dependent.cpp*****************************************

  #include "Dependent.h"

  #include <iostream>

  #include "Independent.h"

  using namespace std;

  Dependent::Dependent()

  {

  cout《"Dependent::Dependent()。"《endl;

  }

  Dependent::~Dependent()

  {

  cout《"Dependent::~Dependent()。"《endl;

  }

  Dependent o2;

  //***********************************main.cpp*********************************

  int main()

  {

  return 0;

  }

  程序的运行结果:

 

  很明显o2是在o1之前被构造出来的,这个应该是编译器随机选择的,我们不能确定o2和o1他们两个之间的构造顺序。

  下面是一些办法,确定o1在o2之前一定被构造出来,因为在很多实际应用中,一些全局对象依赖于另一些全局对象的,虽然我们尽可能要少用全局变量,不过今天讨论的问题跟这个无关。请看修改过的代码:

  //*************Independent.h********************

  #ifndef INDEPENDENT_H

  #define INDEPENDENT_H

  class Independent

  {

  public:

  Independent();

  virtual ~Independent();

  protected:

  private:

  };

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇字符串的反转五种方法 下一篇字符串四则运算的实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: