mixin风格的bases class,用以支持class专属的set_new_handler。读书注意每一个关键词。
以下是引用其他文章:
我常常发现一个问题:如何针对某个类别计数?通常的做法是:针对该类别设计一组static成员和函数。比如
class Widget {
public:
Widget() { AddObj(); }
~Widget() { RemoveObj(); }
static int GetObjCount() { return objcount; }
private:
static void AddObj() { ++objcount; }
static void RemoveObj() { --objcount; }
static int objcount;
};
int Widget::objcount = 0;
void main()
{
Widget w1, w2, w3;
cout << Widget::GetObjCount() << endl;
}
如果另一个类也需要这样的功能,就在该类中加入入一组同样的static函数,以实现计数功能。问题是:如果有很多类,你是否要针对每个类采取相同的做法?
通常避免重复劳动的做法:借助宏。
#define DECLARE_COUNTER() \
public: \
static int GetObjCount() { return objcount; } \
private: \
static void AddObj() { ++objcount; } \
static void RemoveObj() { --objcount; } \
static int objcount;
#define IMPLEMENT_COUNTER( className ) \
int className::objcount = 0;
然后:
class Widget {
public:
Widget() { AddObj(); }
~Widget() { RemoveObj(); }
DECLARE_COUNTER()
};
IMPLEMENT_COUNTER( Widget )
宏虽然可行的,但有更好的做法。
这种做法就是使用"mixin"风格的基类。
此类专为管理类型信息,或者说专为管理static而存在。
用meyers的话就是该基类拥有单一特定的能力(这里就是对象计数能力),由此继承的派生类也将拥有此能力。
"mixin"风格之基类应具有如下特征:
1. 是个模板类
2. 模板参数不被使用(此参数只为生成相应类别之static)
3. 只有static成员和函数
以上述类对象计数器为例:
template <class T>
class ObjCounter {
public:
ObjCounter() { AddObj(); }
~ObjCounter() { RemoveObj(); }
static int GetObjCount() { return objcount; }
static void AddObj() { ++objcount; }
static void RemoveObj() { --objcount; }
private:
static int objcount;
};
template <class T>
int ObjCounter<T>::objcount = 0;
如果一个类继承自ObjCounter,他也将获得计数功能。
class Widget : public ObjCounter<Widget> {
};
你或许会问从ObjCounter<int>继承不也可以吗?是的,但我们不推荐那么做,因为这容易造成混淆。
参考:《Effective C++ 中文版 第三版》p245
《More Effective C++ 中文版》p141