有些时候需要对一个类新添加的对象进行计数,这个估计很多人都会,所有工作就是添加静态成员、修改构造函数和析构函数而已。但有时候又会有一些麻烦的事发生,就是想对一个类家族的每一个类都进行单独计数时,难道每个类单独添加这样的工作么,这样的工作量也未免太大了吧?但是采用从基类继承下来的方法又会有另一个问题出现,下面看看代码:
01 //: C05:CountedClass2.cpp
02 // Erroneous attempt to count objects.
03 #include <iostream>
04 using namespace std;
05 class Counted {
06 static int count;
07 public:
08 Counted() { ++count; }
09 Counted(const Counted&) { ++count; }
10 ~Counted() { --count; }
11 static int getCount() { return count; }
12 };
13 int Counted::count = 0;
14 class CountedClass : public Counted {};
15 class CountedClass2 : public Counted {};
16 int main() {
17 CountedClass a;
18 cout << CountedClass::getCount() << endl; // 1
19 CountedClass b;
20 cout << CountedClass::getCount() << endl; // 2
21 CountedClass2 c;
22 cout << CountedClass2::getCount() << endl; // 3 (Error)
23 } ///:~
这种情况下是为派生自Counted所有类进行计数,而不是我们要的对每个派生自Counted单独进行计数,因为派生自Counted的所有类都共享了相同且唯一的静态数据成员。这时要怎么办,难道要自己为每个类都进行重复的工作么?其实一种奇特的模板构造实现了这种方式,如下:
02 #include <iostream>
03 using namespace std ;
04 template < class T > class Counted {
05 static int count ;
06 public :
07 Counted () { ++ count ; }
08 Counted ( const Counted < T >& ) { ++ count ; }
09 ~ Counted () { -- count ; }
10 static int getCount () { return count ; }
11 };
12 template < class T > int Counted < T >:: count = 0 ;
13 // Curious class definitions
14 class CountedClass : public Counted < CountedClass > {};
15 class CountedClass2 : public Counted < CountedClass2 > {};
16 int main () {
17 CountedClass a ;
18 cout << CountedClass :: getCount () << endl ; // 1
19 CountedClass b ;
20 cout << CountedClass :: getCount () << endl ; // 2
21 CountedClass2 c ;
22 cout << CountedClass2 :: getCount () << endl ; // 1 (!)
23
24 } ///:~