C++中实现Singleton的正确方法
作者:网络转载 发布时间:[ 2013/3/8 10:48:54 ] 推荐标签:
如果某个类管理了系统中的某种资源,那么我们只能创建该类的一个实例,此时用到singleton设计模式(后面为了简化将省略“设计模式”四个字)比较合适了。然而,如果不注意实现方法,很有可能会让我们碰到一些莫名其妙的错误。图1是经过简化所得到的一个实现错误的例子。
main.c
00001: #include <iostream>
00002:
00003: using namespace std;
00004:
00005: class singleton1_t
00006: {
00007: public:
00008: static singleton1_t *instance ()
00009: {
00010: return &instance_;
00011: }
00012:
00013: void count_increase () {count_ ++;}
00014: int count () const {return count_;}
00015:
00016: private:
00017: singleton1_t (): count_ (0) {}
00018: ~singleton1_t () {}
00019:
00020: static singleton1_t instance_;
00021: int count_;
00022: };
00023:
00024: class singleton2_t
00025: {
00026: public:
00027: static singleton2_t *instance ()
00028: {
00029: return &instance_;
00030: }
00031:
00032: private:
00033: singleton2_t () {singleton1_t::instance ()->count_increase ();}
00034: ~singleton2_t () {}
00035:
00036: static singleton2_t instance_;
00037: };
00038:
00039: singleton2_t singleton2_t::instance_;
00040: singleton1_t singleton1_t::instance_;
00041:
00042: int main ()
00043: {
00044: (void) singleton2_t::instance ();
00045: cout << "count = " << singleton1_t::instance ()->count () << endl;
00046: return 0;
00047: }
图中的两个类在实现singleton时都将类的构造和析构函数的对外可视性设为private,这是实现singleton首先要注意的一个点。通过这一手段,有助于预防他人粗心地定义类实例。
图中的singleton2_t类在其构造函数中调用singleton1_t类的count_increase ()方法使计数加一。第44行的代码用于代表使用singleton2_t实例。第46行代码则显示singleton1_t类的记数信息。图2示例了该程序的运行结果。
$ g++ main.cpp -o singleton.exe
$ ./singleton.exe
count = 0
是不是对于终的显示计数为0而不是1感到奇怪?错误发生的原因在于,singleton2_t类实例的构造是先于singleton1_t类的,当singleton1_t类的实例在后构造时会把count_变量置成0,从而覆盖singleton2_t的构造函数所引起的变更。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11