<<More Effective C++>>笔记C++技巧1

本文介绍如何使用C++实现单例模式,并探讨了类对象数量的控制方法及如何要求或禁止在堆中创建对象。通过示例代码展示了单例模式的具体实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值