#include <stddef.h>
#include <iostream>
template <typename CountedType>
class ObjectCounter {
private:
static size_t count; // number of existing objects
protected:
// default constructor
ObjectCounter() {
++ObjectCounter<CountedType>::count;
}
// copy constructor
ObjectCounter (ObjectCounter<CountedType> const&) {
++ObjectCounter<CountedType>::count;
}
// destructor
~ObjectCounter() {
--ObjectCounter<CountedType>::count;
}
public:
// return number of existing objects:
static size_t live() {
return ObjectCounter<CountedType>::count;
}
};
template <typename CountedType>
size_t ObjectCounter<CountedType>::count = 0;
template <typename CharT>
class MyString : public ObjectCounter<CharT> {
};
template < typename CharT>
class MyString2 : public ObjectCounter<CharT >{
};
void main()
{
MyString<char> s1, s2;
MyString2<char> s3;
MyString<wchar_t> ws;
std::cout << "number of MyString<char>: "
<< MyString<char>::live() << std::endl;
std::cout << "number of MyString2<char>: "
<< MyString2<char>::live() << std::endl;
std::cout << "number of MyString<wchar_t>: "
<< ws.live() << std::endl;
}
Output: 3 3 1
==========
template <typename CharT>
class MyString : public ObjectCounter<MyString<CharT> > {
};
template < typename CharT>
class MyString2 : public ObjectCounter<MyString2<CharT> >{
};
void main()
{
MyString<char> s1, s2;
MyString2<char> s3;
MyString<wchar_t> ws;
std::cout << "number of MyString<char>: "
<< MyString<char>::live() << std::endl;
std::cout << "number of MyString2<char>: "
<< MyString2<char>::live() << std::endl;
std::cout << "number of MyString<wchar_t>: "
<< ws.live() << std::endl;
}
Output : 2 1 1