在这种情况下,构造函数Year()是否安全?
struct Year {
int year;
Year(int y) : year(y) {}
Year() { *this = Year(1970); } // *this = this->operator=(Year(1970));
};
Year y;
Run Code Online (Sandbox Code Playgroud)
我想是的,因为一旦执行流程到达构造函数体,就已经用int()初始化了year.还有其他需要考虑的问题吗?
不要考虑其他相同技巧可能导致麻烦的情况.
是否可以在真正需要时初始化Singleton的实例?
考虑从着名的"设计模式"中获取的这种模式:
class Singleton {
public:
static Singleton* Instance();
protected:
Singleton();
private:
static Singleton* _instance;
}
Singleton* Singleton::_instance = 0; // unit.cpp
static Singleton* Singleton::Instance() {
if (_instance == 0) {
_instance = new Singleton;
}
return _instance;
}
Run Code Online (Sandbox Code Playgroud)
现在,我认为那里的模式存在问题,如果有人希望将库中的Singleton提供给其他人:如果用户Singleton::Instance()在初始化_instance之前从另一个编译单元调用(例如在静态数据成员初始化期间),然后跟随调用Singleton::Instance()可能会创建Singleton的另一个实例,并产生不需要的结果,因为_instance可能首先被初始化为0.
我认为一种解决方案是以这种方式初始化_instance:
Singleton* Singleton::_instance = Singleton::Instance();
Run Code Online (Sandbox Code Playgroud)
无论如何,这使得初始化对于那些不需要调用Singleton :: Instance()来初始化其静态数据的人来说不是"懒惰".
是否有更好的解决方案,以便在需要Singleton实例时可以进行初始化?