有时候我们需要跟踪一个类的对象个数,又不想为每一个类去实现引用计数,我们可以使用继承思维去实现这一目标。
#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;
}
这也就是模板的奇特递归模式吧

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

被折叠的 条评论
为什么被折叠?



