派生自单例:基数和派生各一个对象
Deriving from singleton : one object each of base and derived?
我有一个singleton class A
,有virtual protected destructor
和private constructor
。我公开从中衍生并创建了 B 类。
我可以创建两个对象,分别是基类和派生类吗?
如果我不能,还有其他方法可以共享相同的代码吗?
当我尝试它时,我收到编译时错误:
warning C4356: 'A::variable' : static data member cannot be initialized
via derived class
B.cpp(4): error C2371: 'variable' : redefinition; different basic types
这完全取决于您的单例是如何实现的。 如果它有某种公共构造函数,那么您可能可以将其单例性扩展到B
的派生实例。 如果它是某种工厂方法,那么可能不是。 它具有protected dtor
的事实表明它是为用作基类而构建的。
不要与两个独立的习语混淆:
- 继承是C++语言机制的一部分
- 单一实例是一种实例化策略,在代码中定义
因此,您的问题的答案是"这取决于您如何实现实例化策略"。
如果我理解正确,您想要实现的是一个可重用的单例模式基类。可以使用模板基类和名为 CRTP 的模式来执行此操作。这个问题也提供了这种技术的简单解释。
具体来说,这意味着做这样的事情:
template<typename TDerived>
class Singleton {
public:
static TDerived& instance() {
static TDerived instance_;
return instance_;
}
protected:
Singleton() {}
virtual ~Singleton() {}
};
class ConcreteSingleton : public Singleton<ConcreteSingleton> {
public:
...
protected:
ConcreteSingleton() {
...
}
virtual ~ConcreteSingleton() {
...
}
};
此特定版本要求基类具有默认构造函数。其他更复杂的接口可以缓解这个问题。
总体而言,正如一些评论中所指出的,单例作为一种模式存在可伸缩性问题,尽管常量单例通常被认为更安全。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- 当一个对象不是派生类时,滥用interpret_cast将其转换为派生类可以吗
- 如何将所有派生类对象保存在一个容器中
- 派生自单例:基数和派生各一个对象
- 调用基类的复制构造函数,同时通过复制派生类的另一个对象来创建派生类的对象
- 只有一个基类函数成员在派生类对象上执行的情况
- 我有一个基对象和派生类对象的向量,但我无法访问存储在向量中的派生对象继承的数据成员
- 我可以判断std::type_info对象是否等于另一个对象或从另一个对象派生的类吗?