mixin风格的bases class


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 ObjCounter {
public:
     ObjCounter() { AddObj(); }
    ~ObjCounter() { RemoveObj(); }
    static int GetObjCount() { return objcount; }
    static void AddObj() { ++objcount; }
    static void RemoveObj() { --objcount; }
private:
    static int objcount;
};

template  
int ObjCounter::objcount = 0;

如果一个类继承自ObjCounter,他也将获得计数功能。
class Widget : public ObjCounter {
};

你或许会问从ObjCounter继承不也可以吗?是的,但我们不推荐那么做,因为这容易造成混淆。

参考:
《Effective C++ 中文版 第三版》p245
《More Effective C++ 中文版》p141 

你可能感兴趣的:(C++)