新实现最大的变化,在于将以前的类静态变量从类实例变成了类指针,并在instance()函数中需要时通过new操作符创建类实例。指针在C++中仍是当作一种原始数据类型处理的,其初始化与类实例的初始化不同,不需调用类构造函数。在这一实现中,两个类的静态变量p_instance_的初始化都是在程序的.bss段初始化时一次性完成的。singleton
这一实现中由于类的实例是通过new操作符获得的,所以需要为类定义释放实例的函数(图中省略了),并由在合适的时机调用。为了省去这类麻烦,作者更推崇图4所示的实现方式。
- main.c
- 00005: class singleton1_t
- 00006: {
- 00007: public:
- 00008: static singleton1_t *instance ()
- 00009: {
- 00010: if (0 == p_instance_) {
- 00011: static singleton1_t instance;
- 00012: p_instance_ = &instance;
- 00013: }
- 00014: return p_instance_;
- 00015: }
- 00016:
- 00017: void count_increase () {count_ ++;}
- 00018: int count () const {return count_;}
- 00019:
- 00020: private:
- 00021: singleton1_t (): count_ (0) {}
- 00022: ~singleton1_t () {}
- 00023:
- 00024: static singleton1_t *p_instance_;
- 00025: int count_;
- 00026: };
通过在函数内部定义静态变量的方法获得类实例,一方面简化了类接口的实现,另一方面又降低了因为忘记调用释放接口函数而导致内存泄漏的可能。需要提醒的是,在这种实现方法中,类实例的构造是发生在各类的instance()函数第一次被调用时,而各实例的析构又是以与构造相反的顺序进行的,且后者是由编程语言环境所保证的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-21891-3.html
怎么也没法输入