当前位置: 首页 > 知识库问答 >
问题:

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

公冶高义
2023-03-14

Singleton设计模式说我们应该在“single instance”类中定义一个私有静态属性。但是,没有适当的解释为什么数据成员必须是私有静态的。如果数据成员只是私有的,会有什么不同吗?

在以下代码中:

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

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

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

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

共有2个答案

张卓
2023-03-14

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

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

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

static Singleton* getInstance()
{ 
    if (instance == nullptr) 
        instance = new Singleton();
    return instance;
}
燕琛
2023-03-14

对于单例类,应该禁止用户从中创建对象。因此,构造函数是私有的,并防止复制构造函数和赋值运算符

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;
}
 类似资料:
  • 问题内容: Swift的最佳做法是什么? 选项1: 然后 选项2: 然后 问题答案: tl; dr 当您存储可变状态时的选项1(类或结构),因为您需要其他实例。 当您要存储静态变量时,可以使用选项2(作用域全局变量),因为它速度更快且使用的内存更少。 具有变量的Singleton类(或结构) 全球状态通常被认为是“坏事”。很难考虑,会引起问题,但有时是不可避免的。 如果您想拥有多个实例,请创建一个

  • 我想使用Powermock(基于EasyMock)模拟私有静态内部类。这不是来自生产代码,这只是一个是否可能的问题。我很确定这是一个糟糕的设计,但这是我为科学而努力的东西。 假设我们有一个具有静态私有内部类的类: IExpectationSetters中的andReturn(capture)不能应用于(java.lang.Object)  私人静态内部阶级的嘲笑甚至可能吗?我还没有在SO上找到一个

  • 我是kotlin的新手,当我阅读kotlin中的数据类时,我发现了这些代码。这基本上是java模型类和kotlin数据类之间的比较,而且这两个代码都执行相同的任务。 代码1 代码2 我的问题是,在数据类中,所有变量都是公共的而不是私有的,任何人都可以在此类对象的帮助下直接访问变量,但在java代码中,所有变量都是私有的,这就是为什么我们必须为这些成员变量编写getter和setter,如果它是公共

  • 编译良好:gcc Version4.8.5(Ubuntu4.8.5-2Ubuntu1~14.04.1) 结果出现错误:clang Version3.4-1Ubuntu3(TAGS/RELEASE_34/FINAL)(基于LLVM 3.4)

  • 我正在装一个应用程序,它工作得很好。但当我使用 在OuterClass中,并通过

  • 问题内容: 单例与仅填充静态字段的类有何不同? 问题答案: 几乎每次我编写静态类时,我最终都希望自己将其实现为非静态类。考虑: 可以扩展非静态类。多态可以节省很多重复。 非静态类可以实现接口,当您要将实现与API分开时,该接口会派上用场。 由于这两点,非静态类使编写依赖它们的项目的更可靠的单元测试成为可能。 但是,单例模式距离静态类仅半步之遥。你_那种_得到这些好处,但如果你是直接与其它类中通过`