类对象引用计数使用模板实现(奇特的递归模板模式)

本文介绍了一种利用模板类来实现对象计数的方法,解决了派生类共享静态计数器的问题。通过模板递归模式,每个派生类都能拥有独立的计数器。

有时候我们需要跟踪一个类的对象个数,又不想为每一个类去实现引用计数,我们可以使用继承思维去实现这一目标。

#include "stdafx.h"
#include <iostream>
using namespace std;  
class Counted {
private:
	static int count;
public:
	Counted()
	{
		++count;
	}
	Counted(const Counted&)
	{
		++count;
	}
	~Counted()
	{
		--count;
	}
	static int getCount()
	{
		return count;
	}
};
int Counted::count = 0;
class CountedClass :public Counted
{

};
class CountedClass2 :public Counted
{

};
int main() {
	//Koenig::KoenigArg karg(10);
	//cout << karg;

	CountedClass a;
	cout << CountedClass::getCount() << endl;
	CountedClass b;
	cout << CountedClass::getCount() << endl;
	CountedClass2 c;
	cout << CountedClass2::getCount() << endl;
	return 0;
}

但是结果却是错误的

派生自counted的类共享了相同的、唯一的静态数据成员。

那么解决这个问题的办法是使用模板:

#include <iostream>
using namespace std;
template<class T>class Counted {
private:
	static int count;
public:
	Counted()
	{
		++count;
	}
	Counted(const Counted<T>&)
	{
		++count;
	}
	~Counted()
	{
		--count;
	}
	static int getCount()
	{
		return count;
	}
};
template<class T>int Counted<T>::count = 0;
class CountedClass :public Counted<CountedClass>
{

};
class CountedClass2 :public Counted<CountedClass2>
{

};
int main() {
	//Koenig::KoenigArg karg(10);
	//cout << karg;

	CountedClass a;
	cout << CountedClass::getCount() << endl;
	CountedClass b;
	cout << CountedClass::getCount() << endl;
	CountedClass2 c;
	cout << CountedClass2::getCount() << endl;
	return 0;
}


这也就是模板的奇特递归模式吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值