Given:
class Foo {
private:
static int cntFoos;
//... stuff...
public:
Foo() { cntFoos++; }
~Foo() { cntFoos--; }
};
... where "stuff" may be any set of properties. (The idea is to have a counter of instances of that class)
Then:
Foo aFoo;
Foo twoFoo=aFoo;
Will invoke the automatic copy constructor, and thus I'd miss counting this one.
Is there a way to keep that counter reflecting the new instances created automatically? If I implement the explicit copy constructor, I will have to assign all the properties one by one. However, I want a shallow, memberwise copy. I don't need to perform a deep copy, so it seems like a lot of unnecessary work to implement an explicit copy constructor.
Since you want the default behavior for most members and only need special handling for one (static) member, why not encapsulate that special handling in its own class and make a member variable of that class? Like this:
Implementation notes:
InstanceCounter
a template so that different classes can easily have their own instance counts.InstanceCounter
.Alternatively, and probably better, using the CRTP idiom: