说来惭愧,大学没有好好学,第一次听到这个所谓Singleton的时候是在一个校园招聘会上。大致的题目就是要写一个Singleton,答案么大概也可以预计,就是什么都不知道, 呵呵。时过境迁,也写过了一些这样的东西,现在回过头来,还有很有意义的。不搞的特别另类,还是循着书中介绍的顺序来看看吧。
大致看上去这个东西还是比较怪异的,怪异在什么地方呢?就是这个static的instance_是一个object而不是一个指针。这个带来什么问题呢?就是这个变量的初始化时间不是程序员决定的而是编译器决定的。这样的话一些其他的变量如果对之有依赖的话,就会引发一些没有定义的行为。比如说这里在其他文件中( 注意其他文件中)有另一个全局变量.
那这个globala在创建的时候就是未定义的。 当然这种行为只是未定义而不是一定是错的,就我用MS的编译器测试来看,instance_是可以被正确的初始化的,同时类似的行为用一个全部变量来初始化另一全局变量貌似问题也不大。(而其编译器都没有任何的warning!!!,但是不得不提一句,在C里面你要是想做这样的事情恐怕就是不罩的因为所谓要求右值是常量的限制 ),在网上搜索了一下看到了一些的论述,大致的意思和书中类似,比如下面这个URL
http://stevewetherill.com/2008/10/25/c-static-
- // Header file Singleton.h
- class Singleton
- {
- public:
- static Singleton* Instance() // Unique point of access
- {
- return &instance_;
- }
- int DoSomething();
- private:
- Singleton();
- Singleton(const Singleton&);
- Singleton& operator=(const Singleton&);
- ~Singleton();
- };
- // Implementation file Singleton.cpp
- Singleton Singleton::instance_;
大致看上去这个东西还是比较怪异的,怪异在什么地方呢?就是这个static的instance_是一个object而不是一个指针。这个带来什么问题呢?就是这个变量的初始化时间不是程序员决定的而是编译器决定的。这样的话一些其他的变量如果对之有依赖的话,就会引发一些没有定义的行为。比如说这里在其他文件中( 注意其他文件中)有另一个全局变量.
- int globala = Singleton::Instance()->DoSomething();