在这个Singleton习语中,我们真的必须让child类成为朋友吗?

In this Singleton idiom, do we really have to make child class friend?

本文关键字:child 朋友 Singleton 习语 真的 我们      更新时间:2023-10-16

在我的程序中,我使用了c++中最常见的单例模式之一,随着c++ 11的到来,我在逻辑上增强了它,下面是我的最终代码:

template <class T>
class Singleton {
  public:
    ~Singleton() = default;
    static T& getInstance() {
        if (instance.get() == nullptr)
            instance = std::shared_ptr<T>(new T());
        return *instance;
    }
    static void killInstance() {
        instance = std::shared_ptr<T>(nullptr);
    }
  protected:
    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
  private:
    static std::shared_ptr<T> instance;
};
template <typename T>
std::shared_ptr<T> Singleton<T>::instance(nullptr);

所以在互联网上,我们可以看到这个模式在许多网站上教授,但我有一个问题,在我发现的每个网站中,据说每个单例都必须这样声明:

class MySingleton : public Singleton<MySingleton> {
    friend classSingleton<MySingleton>
};

但是据我所知,标准(不仅从c++ 11开始)明确规定,一个类自动成为它所有子类的朋友(相反,子类不是,因为它们是基于父类的可访问性和继承类的可访问性),这是很有道理的。所以我到处看到的这句话看起来真的很没用和毫无意义,不是吗?有人能确认我可以毫无问题地处理掉它吗?

提前感谢大家;)

但是据我所知,标准(不仅从c++ 11开始)清楚地声明一个类自动成为其所有类的友元孩子

这是一个误解。这两个概念是正交的:一个类是而不是它的子类的朋友。