1 回答
TA贡献1790条经验 获得超9个赞
singleton翻译成单例,整个程序运行过程中只能存在这个类的一个对象。
实现方式有三种。
第一种 - 全局静态变量:
1 2 3 4 5 6 7 8 9 10 11 | class Singleton { private: static Singleton instance; //静态变量,全局只有这一个对象 Singleton() {} //构造函数放在private里,让外部无法构造对象 Singleton(const Singleton&); //复制构造函数放在private里,让外部无法复制对象 Singleton& operator=(const Singleton&); //赋值函数放在private里,让外部无法复制对象 public: Singleton& getInstance() { return instance; } };
Singleton Singleton::instance;//构造一个静态变量,作为全局唯一的对象。 |
第二种 - 局部静态变量:
1 2 3 4 5 6 7 8 9 10 11 | class Singleton { private: Singleton() {} //构造函数放在private里,让外部无法构造对象 Singleton(const Singleton&); //复制构造函数放在private里,让外部无法复制对象 Singleton& operator=(const Singleton&); //赋值函数放在private里,让外部无法复制对象 public: Singleton& getInstance() { static Singleton instance; //局部静态变量,全局只有这一个对象 return instance; } }; |
第三种 - 第一次用的时候申请内存,以后都直接用它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Singleton { private: Singleton *instance; Singleton() {} //构造函数放在private里,让外部无法构造对象 Singleton(const Singleton&); //复制构造函数放在private里,让外部无法复制对象 Singleton& operator=(const Singleton&); //赋值函数放在private里,让外部无法复制对象 public: Singleton1* getInstance() { if (instance == NULL) { mutex_lock(); //并没有这个函数,我只是示意一下,表示互斥锁 if (instance == NULL) { instance = new Singleton(); } mutex_release(); //释放互斥锁 } return instance; } }; |
第一种特点是程序加载时间长。因为静态变量是在main函数之前进行构造的。变量存在静态存储区。
第二种特点是第一次用的时候构造,以后都返回它。变量存在静态存储区。
第三种特点是第一次用的时候构造,以后都返回它。变量存在堆内存中。
如果变量占用内存比较大,或者程序里运用特别多的单例导致占用很多内存,不建议用静态存储方式,因为静态存储区的大小是有限的。可能程序都运行不起来。
- 1 回答
- 0 关注
- 556 浏览
添加回答
举报