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

来源:互联网 发布:淘宝投诉制作原图 编辑:程序博客网 时间:2024/04/28 17:03

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

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


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

0 0
原创粉丝点击