首页 文章

Singleton类中的静态私有数据成员

提问于
浏览
0

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

在以下代码中:

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

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

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

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

2 回答

  • 2

    静态意味着它是类的一部分,该类的所有对象(实例)将指向同一个实例 .

    “getInstance”是一种静态方法,只能访问静态对象 . 如果“instance”不是静态的,不是“类”的一部分,那么“getInstance”不能返回实例 .

    尝试使用声明为非静态的实例运行以下代码:

    static Singleton* getInstance()
    { 
        if (instance == nullptr) 
            instance = new Singleton();
        return instance;
    }
    
  • 3

    要使一个类成为单例,您应该禁止用户从中创建对象 . 因此,您将构造函数设置为private,并且还会阻止复制构造函数和赋值运算符 .

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

相关问题