//: C05:CountedClass.cpp // Object counting via static members. #include <iostream> using namespace std; class CountedClass { static int count; public: CountedClass() { ++count; } CountedClass(const CountedClass&) { ++count; } ~CountedClass() { --count; } static int getCount() { return count; } }; int CountedClass::count = 0; int main() { CountedClass a; cout << CountedClass::getCount() << endl; // 1 CountedClass b; cout << CountedClass::getCount() << endl; // 2 { // An arbitrary scope: CountedClass c(b); cout << CountedClass::getCount() << endl; // 3 a = c; cout << CountedClass::getCount() << endl; // 3 } cout << CountedClass::getCount() << endl; // 2 } ///:~
Listado 6.43. C05/CountedClass.cpp
//: C05:CountedClass2.cpp // Erroneous attempt to count objects. #include <iostream> using namespace std; class Counted { 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() { CountedClass a; cout << CountedClass::getCount() << endl; // 1 CountedClass b; cout << CountedClass::getCount() << endl; // 2 CountedClass2 c; cout << CountedClass2::getCount() << endl; // 3 (Error) } ///:~
Listado 6.44. C05/CountedClass2.cpp
//: C05:CountedClass3.cpp #include <iostream> using namespace std; template<class T> class Counted { 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; // Curious class definitions class CountedClass : public Counted<CountedClass> {}; class CountedClass2 : public Counted<CountedClass2> {}; int main() { CountedClass a; cout << CountedClass::getCount() << endl; // 1 CountedClass b; cout << CountedClass::getCount() << endl; // 2 CountedClass2 c; cout << CountedClass2::getCount() << endl; // 1 (!) } ///:~
Listado 6.45. C05/CountedClass3.cpp