【问题标题】:Static Objects in a Class (Singleton)类中的静态对象(单例)
【发布时间】:2019-10-17 15:25:32
【问题描述】:

我正在研究单例设计模式的两种实现。

我想知道第二个是如何工作的,特别是:

  1. 为什么作者选择返回 DB 作为参考。

  2. 为什么getDatabaseConnection()中的静态类对象DB不需要像这样在SingleDatabase类之外定义:

SingletonDatabase& SingletonDatabase::DB;
  1. 静态类对象是否像静态变量一样只创建一次(并且在同一类的所有对象之间共享)?

实施

class SingletonDatabase {
    private:
        SingletonDatabase() {
            std::cout << "Initializing database" << std::endl;
            instanceCount++; // Used in testing later on.
        }

    public:
        SingletonDatabase(const SingletonDatabase&) = delete;
        SingletonDatabase& operator=(const SingletonDatabase&) = delete;
        static SingletonDatabase& getDatabaseConnection() {
            static SingletonDatabase DB;
            return DB;
        }
        static int instanceCount;
};

int SingletonDatabase::instanceCount = 0;

我习惯于看到使用静态指针的实现,作者提到它不是线程安全的。他更喜欢这种方法。

谢谢!

【问题讨论】:

  • 你所说的“静态对象”和“静态变量”其实是一样的。符号DB 是一个变量。变量包含对象。

标签: c++ class design-patterns static singleton


【解决方案1】:
  1. 为什么作者选择返回 DB 作为参考。

也可以使用指针来代替引用。该参考更好地表达了被指点对象被授予存在。 (按值返回会破坏这个概念。)

  1. 为什么getDatabaseConnection()中的静态类对象DB不需要像这样在SingleDatabase类之外定义:

SingletonDatabase&amp; SingletonDatabase::DB;

它不是一个成员变量,而是一个 static 变量,具有局部范围但静态的生命周期 → 被授予从第一次访问到进程结束存在的时间。

SO: What is the lifetime of a static variable in a C++ function?(有点陈旧但仍然正确)

这将在普通函数中以相同的方式工作。周围的函数是一个(static 成员函数)与此无关。

  1. 是否像静态变量一样,静态类对象只能创建一次(并且在同一类的所有对象之间共享)?

是的。

正确地说,它在此函数的任何调用者之间共享。


顺便说一句。这被称为 Meyers Singleton

FleCSI: Meyer’s SingletonSO: C++ Singleton design pattern

SO: Is Meyers' implementation of the Singleton pattern thread safe?

【讨论】:

【解决方案2】:

完成@Scheff 的要点:

我习惯于使用静态指针来查看实现, 作者提到的不是线程安全的。他更喜欢这种方法。

正如this Q/A 所示,使用指针实现单例模式不是线程安全的。

【讨论】:

  • 这不是我问的。我问了三个问题,第三个已经回答了。
猜你喜欢
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多