基类如何禁用派生类的构造函数
how can a base class disable the derived class's constructor
我试着写一个单例类,这样一个类只需要从它派生,并自动成为单例:
基类:
template <class T>
class Singleton
{
private:
static T* instance;
public:
static T* getInstance(void)
{
if(!instance)
instance = new T;
return instance;
}
static void release(void)
{
if(instance)
{
delete instance;
instance = NULL;
}
}
};
template <class T>
T* Singleton<T>::instance = NULL;
派生类:
#include <iostream>
#include "Singleton.h"
class MySingleton : public Singleton<MySingleton>
{
public:
void helloWorld(void)
{
printf("Hello, World!n");
}
};
主:int main(int argc, const char * argv[])
{
MySingleton* s = MySingleton::getInstance();
s->helloWorld();
return 0;
}
这工作完美,但它不是一个真正的单例,因为我仍然可以使用它的默认构造函数构造MySingleton。当然,我可以将MySingleton的函数设为私有,并将Singleton声明为友例,但是否有办法在基类中做到这一点,以便仅仅派生而不声明任何函数就足以使类成为单例?
由于基类模板必须构造单例对象,因此它需要访问具体类的构造函数。因此,该构造函数应该是public的,或者基类必须是具体类的友类。每个人都可以访问具体类中的公共actor,因此您不能在编译时禁止它的使用。但是,您可以确保它只在运行时被调用一次:
template <class T>
class Singleton
{
/* ... */
static bool instantiating;
protected:
Singleton()
{
if (!instantiating) //not called in instance() function
throw std::runtime_error("Don't call me!");
}
public:
static T* getInstance()
{
intantiating = true;
instace = new T();
instantiating = false;
}
};
template <class T>
bool Singleton<T>::instantiating = false;
指出:-我在这里使用的instantiating
变量不是线程安全的instantiating
的真/假设置不是异常安全的(new
或T::T()
可能会抛出)-使用指针作为实例变量是不安全的,容易发生内存泄漏。考虑使用shared_ptr
或引用(Meyers单例)
相关文章:
- 如何委托派生类使用其父构造函数?
- 如果基类包含双指针成员,则派生类的构造函数
- C++:为什么无法在派生类中访问受保护的构造函数?
- C++派生的类构造函数
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 在没有默认构造函数的情况下创建的派生对象
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 如何在派生构造函数中多次构造基类
- C++(控制台)构造函数和派生类
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 在dynamic_pointer_cast后调用派生类的构造函数
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 将派生类的构造函数声明为父类的友元
- 如何为具有私有成员的派生类实现移动构造函数
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在派生自线程类的构造函数中传递字符串
- C++ 为什么要将对基类的引用传递给派生类的构造函数
- C++将派生类的const值传递给基意外行为的构造函数
- 在模板派生类中继承具有类型别名的构造函数
- 正在调用基方法,而不是从构造函数派生方法