<>笔记C++技巧1

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;
}



你可能感兴趣的:(<>笔记C++技巧1)