设为首页 加入收藏

TOP

C++中静态初始化的相依性(一)
2013-12-05 13:06:07 来源: 作者: 【 】 浏览:352
Tags:静态 初始 相依

  这几天读《C++编程思想》时碰到讲解静态初始化的相依性,感觉十分晦涩。于是,自己总结了一下,以理清思路。

  一、问题出在哪里?

  在写一个工程的时候,如果一个静态变量的初始化依赖于另一个静态变量,那么他们的顺序是很重要的。基本的变量需要首先声明。然而,当我们写的程序需要这样子做但是又必须将相互依赖的静态对象放到不同的文件中时,那么它们初始化的顺序就交给了连接器。这是一个无法掌控的过程,会使初始化出现问题。

  看下面这个例子。base是一个基本的类。而extend类有一个base类型的全局实例的成员。如果将两个类放入两个头文件中,那么最后引入的结果就是:在含有main函数的文件中不会出现base实例化的语句。具体base实例化在哪里发生要靠连接器了。错误的顺序倒是base没有正确的初始化。以下程序模拟错误发生的过程:

  #include <iostream>

  using namespace std;

  class base

  {

  bool init;

  public:

  base() : init(true) { }

  void print() const

  {

  cout 《 "Base init: " 《 init 《 endl;

  }   };

  class extend   {

  base mem;

  public:

  extend(const base &h) : mem(h) {

  cout 《 "extend's constructor: " 《 endl;

  print();

  }

  void print() const

  {

  mem.print();

  }   };

  extern base base1;

  extend extend1(base1);

  base base1;

  extern base base2;

  base base2;

  extend extend2(base2);

  int main()

  {

  return 0;

  }

  二、解决的办法

  一种比较直观的解决办法:

  将类型的实例化封装在函数内。函数只是创建一个静态实例,该实例只在函数中可见,返回该静态实例的引用。从而达到创建的目的。第一次调用函数时,静态实例被正确初始化,以后调用,会指向同一个静态实例,不会创建新的静态实例,从而达到类似全局变量的目的。

   

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇单链表的创建插入与删除 下一篇二叉树高度的平衡标准

评论

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

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)