This solution contains code for both (per-class and global) counters.
extern size_t Global_counter; //In .cpp file define it: size_t Global_counter = 0;
template <class T>
class CountedClass
{
protected:
static size_t this_class_counter;
public:
static size_t GetThisClassCounter()
{
return this_class_counter;
}
static size_t GetGlobalCounter()
{
return Global_counter;
}
CountedClass()
{
++this_class_counter;
++Global_counter;
}
};
template <class T>
size_t CountedClass<T>::this_class_counter = 0;
Sample usage:
class A : public CountedClass<A>
{
public:
A() : CountedClass<A>()
{
}
};
class B : public CountedClass<B>
{
public:
B() : CountedClass<B>()
{
}
};
A a1;
A a2;
B b2;
std::cout<<A::GetThisClassCounter(); //prints 2
std::cout<<A::GetGlobalCounter(); //prints 3
std::cout<<B::GetThisClassCounter(); //prints 1
std::cout<<B::GetGlobalCounter(); //prints 3