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 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 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值