既然您想要大多数成员的默认行为并且只需要对一个(静态)成员进行特殊处理,为什么不将这种特殊处理封装在它自己的类中并创建该类的成员变量呢?像这样:
template<typename T>
class InstanceCounter
{
public:
static int Count;
// Automatically invoked when a class containing it is created.
InstanceCounter() { Count++; }
// Automatically invoked when a class containing it is destroyed.
~InstanceCounter() { Count--; }
// Automatically invoked when a class containing it is copy-constructed.
InstanceCounter(const InstanceCounter& rhs) { Count++; }
// No need to override operator=
// Allow this counter to be used as an int.
operator int() const { return Count; }
};
template<typename T>
int InstanceCounter<T>::Count;
class Foo
{
public:
InstanceCounter<Foo> count;
};
实施说明:
- 我制作
InstanceCounter
了一个模板,以便不同的类可以轻松地拥有自己的实例数。
- 对于 C++11,您还需要为
InstanceCounter
.
或者,也许更好,使用 CRTP 成语:
template<typename T>
class InstanceCounted
{
public:
static int InstanceCount;
// Automatically invoked when a class containing it is created.
InstanceCounted() { InstanceCount++; }
// Automatically invoked when a class containing it is destroyed.
~InstanceCounted() { InstanceCount--; }
// Automatically invoked when a class containing it is copy-constructed.
InstanceCounted(const InstanceCounted& rhs) { InstanceCount++; }
// No need to override operator=
};
template<typename T>
int InstanceCounted<T>::InstanceCount;
class Foo : public InstanceCounted<Foo>
{
// insert class contents here
};
// Now we can access Foo::InstanceCount.