0%

单例可继承模板类

用instance()方法初始化,禁用构造,析构函数

父类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
template<typename T>
class Manager
{
public:
//可继承单例模板
static T* instance()//返回具体Manager指针,而不是基类指针
{
if (!manager)
manager = new T();
return manager;
}

private:
static T* manager;//实例化具体子类的对象

protected:
//避免在程序外部(类外)有多个实例
Manager() = default;
~Manager() = default;
Manager(const Manager&) = delete;//删除拷贝构造函数
Manager& operator=(const Manager&) = delete;//删除拷贝运算符
};

template<typename T>
T* Manager<T>::manager = nullptr;//对第21行manager的定义,初始化成空指针

子类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class GameManager :public Manager<GameManager>
{
friend class Manager<GameManager>;//父类要访问子类protected里的内容
//要想构造一个子类,需要调用父类中的instance()函数,而instance()中需要new T(),
//由于子类的构造函数是protected所以需要将父类声明成友元,让其能访问构造函数

public:
int run(int argc, char** argv){}

protected:
GameManager(){}
~GameManager(){}
private:
};


主循环
1
2
3
4
int main(int argc,char** argv)
{
return GameManager::instance()->run(argc, argv);//此时初始化一个GameManager要用instance()方法,调用子类中的run()
}