在这个Singleton习语中,我们真的必须让child类成为朋友吗?
In this Singleton idiom, do we really have to make child class friend?
在我的程序中,我使用了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开始)清楚地声明一个类自动成为其所有类的友元孩子
这是一个误解。这两个概念是正交的:一个类是而不是它的子类的朋友。
相关文章:
- 一位朋友将模板函数缩写为clang和gcc
- 更改"child's parent's style sheet"时如何将孩子的样式表重置为 Qt 默认样式表?
- 班级的朋友是不可接近的
- 与朋友声明相反
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 类似虚拟的朋友功能?
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- 在朋友类中使用模板
- 访问私人成员而不使用朋友类
- 类和朋友在它们之间起作用
- "朋友"成员函数和 GCC 与 Clang
- 朋友声明的复杂范围界定规则有什么意义?
- C++:让函数成为多个类的朋友?
- 有没有办法C++将给定类的功能限制为仅另一个类(不使用继承,朋友)?
- 朋友,前瞻宣言,C++
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 限制多模板参数朋友函数可访问的类实例的范围
- C++:无法将参数1从Child非模板类转换为Parent模板类
- 朋友定义函数的名称空间是什么
- 在这个Singleton习语中,我们真的必须让child类成为朋友吗?