Singleton类

时间:2016-02-23 10:52:01

标签: c++ singleton

Singleton设计模式表示我们应该在"单个实例中定义私有静态属性"类。但是,没有正确的解释为什么数据成员必须是私有静态。如果数据成员只是私有会有什么不同吗?

在以下代码中:

class Singleton
{
public:
    static Singleton* getInstance();

private:
    Singleton(){/*Private constructor*/}
    ~Singleton(){/*Private destructor*/}
    static Singleton * instance; //Why static is required?
};

如果数据成员instance不是静态的,会有什么不同吗?

修改 通过将析构函数公开,它会改变单例设计的属性吗?

2 个答案:

答案 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;
}