【发布时间】:2017-07-24 19:55:13
【问题描述】:
这是我的单身
class MySingleton {
private:
int myNumber;
public:
static MySingleton &get() {
static MySingleton instance;
return instance;
}
int getMyNumber() const {
return myNumber;
}
void setMyNumber(int myNumber) {
MySingleton::myNumber = myNumber;
}
};
这是测试它的代码
MySingleton t1 = MySingleton::get();
t1.setMyNumber(6);
printf("t1: %d \n", t1.getMyNumber());
MySingleton t2 = MySingleton::get();
printf("t2: %d \n", t2.getMyNumber());
现在我得到的输出是
t1: 6
t2: 0
但预期的结果是
t1: 6
t2: 6
看起来MySingleton::get() 正在创建一个新实例,它当然不应该这样做。
【问题讨论】:
-
为什么不应该呢?你没有禁止复制或分配。编译器无法解读您想要的单例概念,您必须指定该行为。
-
请注意,您的单例不是单例。因为它可以被默认构造和复制。
-
当您调用
setMyNumber(6)时,您会在单例的副本(名为t1)上调用它。对get的下一次调用返回对与之前相同的实例的引用,只是它不知道您对副本所做的更改