附录9.3:C++中统计物件个数的完整版实现:把 Counter 变成一个 template

1、编写可以计数的类:

//.h
class Widget { 
public: 
 Widget() { ++count; } 
 Widget(const Widget&) { ++count; } 
 ~Widget() { --count; } 
 static size_t howMany() 
 { return count; } 
private: 
 static size_t count; 
}; 

//.cpp 
size_t Widget::count = 0;

给多个类编写时繁杂,因此最好能够将“计数过程”打包。

2、物件计数类:

//.h
class Counter { 
public: 
 Counter() { ++count; } 
 Counter(const Counter&) { ++count; } 
 ~Counter() { --count; } 
 static size_t howMany() 
 { return count; } 
private: 
 static size_t count; 
};

//.cpp
size_t Counter::count = 0;

使用方法:A:用作基类;B:用作类成员变量。
目前存在的问题:Counter 中的静态变量 count属于类,只有一个,但我们需要为每一个使用 Counter 的 class 准备一个。举个例子,如果我们打算对 class1和 class2类对象计数,我们需要两个 static size_t objects,而不是一个

3、解决办法:把 Counter 变成一个 template:
让每一个想要使用 Counter 的 class,以自己为 template参数具现出这个template类。

//1.h
template<typename T>  //此部分代码为关键
class Counter { 
public: 
 Counter() { ++count; } 
 Counter(const Counter&) { ++count; } 
 ~Counter() { --count; } 
 static size_t howMany() 
 { return count; } 
private: 
 static size_t count; 
}; 
template<typename T> size_t Counter<T>::count = 0; // 模板内容放在.h文件中

3.1、模板Counter的使用方式1:基类公有继承:

class Widget: public Counter<Widget> { 
 ..... 
};

//.cpp
Counter<Widget> * ptr1 = new Widget;
delete ptr1; //结果未定义,派生类没释放

存在问题:作为基类,Counter需要虚析构函数,使得效率变低。

3.2、模板Counter的使用方式2:成员变量:

//.h
class Widget { 
public: 
 ..... 
 static size_t howMany() 
 {return Counter<Widget>::howMany();} 
private: 
 .....
 Counter<Widget> c; 
};

存在问题:添加成员变量,类对象内存变大。

3.3、模板Counter的使用方式3:基类私有继承:

class Widget: private Counter<Widget> { 
public: 
 // 让 howMany 成为 public,用于访问现有个数
 using Counter<Widget>::howMany; 
 ..... 
};

//.cpp
Counter<Widget> *pw =  new Widget; // 错误! 没有隐式转换函式(implicit conversion)
					               // 可以将 Widget* 转为 Counter<Widget>*

优势:私有继承禁止了基类指针指向派生类用法;同时派生类对象内存大小不变。

总结:

1、把 Counter 变成一个 template,让每一个想要使用 Counter 的 class,以自己为 template参数具现出这个template类。
2、==推荐使用私有继承(最好)==或集合方式(次之)使用计数模板。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值