b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

singleton_singleton饿汉式_singleton饿汉(2)

电脑杂谈  发布时间:2016-11-26 02:08:39  来源:网络整理

图中的两个类在实现singleton时都将类的构造和析构函数的对外可视性设为private,这是实现singleton首先要注意的一个点。通过这一手段,有助于预防他人粗心地定义类实例。

图中的singleton2_t类在其构造函数中调用singleton1_t类的count_increase ()方法使计数加一。第44行的代码用于代表使用singleton2_t实例。第46行代码则显示singleton1_t类的记数信息。图2示例了该程序的运行结果。

  1. g++ main.cpp -o singleton.exe 
  2. ./singleton.exe 
  3. count = 0 

是不是对于最终的显示计数为0而不是1感到奇怪?错误发生的原因在于,singleton2_t类实例的构造是先于singleton1_t类的,当singleton1_t类的实例在最后构造时会把count_变量置成0,从而覆盖singleton2_t的构造函数所引起的变更。

尽管这是一个精心设计的错误,但在大型项目中出现这类错误的可能性却并不小。因为在现实项目中,singleton1_t和singleton2_t两个类的实现很可能是在不同的源文件中,这势必造成两个类实例的初始化顺序会因链接顺序不同而不同,《揭示C++中全局类变量的构造与析构顺序》一文介绍了这是为什么。

在本例中,如果将第39行和第40行的代码进行对调就不会出现这种奇怪的现象,但这不是解决问题的终极方法。singleton更好的方法需要更改singleton的实现方法,图3示例了一种新的实现方法。

  1. main.c 
  2. 00001: #include <iostream> 
  3. 00002: 
  4. 00003: using namespace std; 
  5. 00004: 
  6. 00005: class singleton1_t 
  7. 00006: { 
  8. 00007: public
  9. 00008:     static singleton1_t *instance () 
  10. 00009:     { 
  11. 00010:         if (0 == p_instance_) { 
  12. 00011:             p_instance_ = new singleton1_t; 
  13. 00012:         } 
  14. 00013:         return p_instance_; 
  15. 00014:     } 
  16. 00015: 
  17. 00016:     void count_increase () {count_ ++;} 
  18. 00017:     int count () const {return count_;} 
  19. 00018: 
  20. 00019: private
  21. 00020:     singleton1_t (): count_ (0) {} 
  22. 00021:     ~singleton1_t () {} 
  23. 00022: 
  24. 00023:     static singleton1_t *p_instance_; 
  25. 00024:     int count_; 
  26. 00025: }; 
  27. 00026: 
  28. 00027: class singleton2_t 
  29. 00028: { 
  30. 00029: public
  31. 00030:     static singleton2_t *instance () 
  32. 00031:     { 
  33. 00032:         if (0 == p_instance_) { 
  34. 00033:             p_instance_ = new singleton2_t; 
  35. 00034:         } 
  36. 00035:         return p_instance_; 
  37. 00036:     } 
  38. 00037: 
  39. 00038: private
  40. 00039:     singleton2_t () {singleton1_t::instance ()->count_increase ();} 
  41. 00040:     ~singleton2_t () {} 
  42. 00041: 
  43. 00042:     static singleton2_t *p_instance_; 
  44. 00043: }; 
  45. 00044: 
  46. 00045: singleton2_t *singleton2_t::p_instance_ = 0; 
  47. 00046: singleton1_t *singleton1_t::p_instance_ = 0; 
  48. 00047: 
  49. 00048: int main () 
  50. 00049: { 
  51. 00050:     singleton2_t::instance (); 
  52. 00051:     cout << "count = " << singleton1_t::instance ()->count () << endl; 
  53. 00052:     return 0; 
  54. 00053: } 


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-21891-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...