1.实现虚拟构造函数和虚拟非成员函数
把真正的虚拟函数作为类的虚函数即可,其它构造或者非成员类封装下即可。
2.实现单例模式
单例模式,用类函数内的静态成员实现避免类的静态成员一开始初始化,不能控制初始化的时机。
作为指针或者类函数内静态成员可以控制类的初始化时机。
3.控制类的对象数量,不是很有必要
一般应用中很少需要控制的,如果需要 控制,通过在构造函数中限定数量即可,如果要做一个通用的类,可用模板类来实现。
本类可以实例化模板类,也可以继承自自己实例化的模板类。这样的好处是充分提供泛型,而不用继承自某个具体的基类,更加形象。
且这样继承可以用私有继承,因此删掉基类指针时候,只能调用子类的析构函数,避免了内存泄露。
4.要求或禁止在堆中产生对象
要求在堆中可以通过内存池存放对象重载operator new/delete形式得到,不要求在堆中私有化operator new/delete即可。
具体会遇到一些问题,除非编写内存池,否则没有必要这样操作。
// TemplateClass.h
#pragma once
#include<iostream>
using namespace std;
template <class T>
class Singleton
{
public:
static T* Instance()
{
if( m_pInstance == NULL)
{
m_pInstance = new T();
}
return m_pInstance;
}
Singleton()
{
cout<<"Singleton() call"<<endl;
}
virtual ~Singleton()
{
cout<<"~Singleton() call"<<endl;
if( m_pInstance != NULL )
{
delete m_pInstance;
}
}
private:
static T *m_pInstance;
};
// 直接公有继承即可,私有继承把基类的所有非私有成员都作为私有成员,不能再继承了,扩展性不好
class Test: public/*private*/ Singleton<Test>
{
public:
static Test* GetInstance();
void Display()
{
cout<<"Display() call"<<endl;
}
~Test()
{
cout<<"~Test call"<<endl;
}
//private: // 不能作为单例,外部 还是可以轻易调用Test构造函数,不如用静态指针或者规范单例模式来编写
Test()
{
cout<<"Test() call"<<endl;
}
};
template <class T> T* Singleton<T>::m_pInstance = 0;
// TemplateClass.cpp
: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "TemplateClass.h"
Test* Test::GetInstance()
{
return Test::Instance();
}
void TestFunc()
{
Test::GetInstance()->Display();
}
int _tmain(int argc, _TCHAR* argv[])
{
TestFunc();
return 0;
}