Singleton设计模式表示我们应该在"单个实例中定义私有静态属性"类。但是,没有正确的解释为什么数据成员必须是私有静态。如果数据成员只是私有会有什么不同吗?
在以下代码中:
class Singleton
{
public:
static Singleton* getInstance();
private:
Singleton(){/*Private constructor*/}
~Singleton(){/*Private destructor*/}
static Singleton * instance; //Why static is required?
};
如果数据成员instance
不是静态的,会有什么不同吗?
修改 通过将析构函数公开,它会改变单例设计的属性吗?
答案 0 :(得分:3)
要使一个类成为单例,您应该禁止用户从中创建对象。因此,您将构造函数设为私有,并且也会阻止复制构造函数和赋值运算符。
Classname(Classname const&) = delete;
Classname(Classname const&&) = delete;
Classname& operator=(classname const&) = delete;
Classname& operator=(classname const&&) = delete;
然后获取实例的唯一方法是使用类的一些静态函数,静态函数只能访问静态变量。这就是为什么实例变量总是静态变量。
getInstance的另一种替代方法是
static Classname& getInstance()
{
static Classname instance;
return instance;
}
答案 1 :(得分:2)
静态意味着它是类的一部分,该类的所有对象(实例)都将指向同一个实例。
"的getInstance"是一种静态方法,只能访问静态对象。如果"实例"不是静态的,不属于"类",然后" getInstance"无法返回实例。
尝试使用声明为非静态的实例运行以下代码:
static Singleton* getInstance()
{
if (instance == nullptr)
instance = new Singleton();
return instance;
}