关于 DUILIB::UIDelegate.h---的注释和理解

DUILIB::UIDelegate.h—的注释和理解

废话不多说,直接上 代码注释;以下代码来源于DUILIB

#ifndef __UIDELEGATE_H__
#define __UIDELEGATE_H__

#pragma once

--- 
**** *************************************************************************************
___
        //委托基类
class DUILIB_API CDelegateBase   
{
public:
    CDelegateBase(void* pObject, void* pFn);
    CDelegateBase(const CDelegateBase& rhs);
    virtual ~CDelegateBase();

    //判断2个对象是否一样
    bool Equals(const CDelegateBase& rhs) const;

    //调用了 Invoke 函数
    bool operator() (void* param);

    //基类的纯虚函数,用于拷贝一个新的对象
    virtual CDelegateBase* Copy() const = 0; // add const for gcc

protected:
    void* GetFn();
    void* GetObject();
    virtual bool Invoke(void* param) = 0; //调用

private:
    void* m_pObject; //委托的对象
    void* m_pFn;    //函数指针
};

//静态委托
class CDelegateStatic: public CDelegateBase
{
    typedef bool (*Fn)(void*);   //函数指针定义
public:

    //构造函数指针
    CDelegateStatic(Fn pFn) : CDelegateBase(NULL, pFn) { } 
    //复制构造
    CDelegateStatic(const CDelegateStatic& rhs) : CDelegateBase(rhs) { } 
    //拷贝函数
    virtual CDelegateBase* Copy() const { return new CDelegateStatic(*this); }

protected:
    virtual bool Invoke(void* param)
    {
        //获取函数指针
        Fn pFn = (Fn)GetFn();
        //调用函数并传参
        return (*pFn) (param); 
    }
};

//这是一个带模板参数的,委托类
template <class O, class T>  //O代表对象的类型,T代表作用域
class CDelegate : public CDelegateBase
{
    //在类中定义了一个函数指针
    typedef bool (T::* Fn)(void*);
public:
    CDelegate(O* pObj, Fn pFn) : CDelegateBase(pObj, *(void**)&pFn) { }
    CDelegate(const CDelegate& rhs) : CDelegateBase(rhs) { } 
    virtual CDelegateBase* Copy() const { return new CDelegate(*this); }

protected:
    virtual bool Invoke(void* param)
    {
        O* pObject = (O*) GetObject();  //获取拥有这个函数指针的对象
        union
        {
            void* ptr;
            Fn fn;
        } func = { GetFn() };

        //这里定义的一个共用体,只是为了获取函数指针

        //理解为 Object调用自己的成员函数(因为是函数指针所以需要先解除引用)
        //这里指的成员函数是静态的的,或者说是全局函数
        return (pObject->*func.fn)(param);
    }  

private:
    Fn m_pFn; //没有赋值,未用到
};

//函数功能:根据参数生成一个CDelegate类的对象
template <class O, class T>
CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(void*))
{
    return CDelegate<O, T>(pObject, pFn);
}


//内联函数
//根据参数生成 CDelegateStatic类的对象
inline CDelegateStatic MakeDelegate(bool (*pFn)(void*))
{
    return CDelegateStatic(pFn); 
}


class DUILIB_API CEventSource
{
    typedef bool (*FnType)(void*); //函数类型
public:
    ~CEventSource();
    operator bool();
    void operator+= (const CDelegateBase& d); // add const for gcc
    void operator+= (FnType pFn); //添加静态委托,调用MakeDelegate 函数,在调用上一个函数
    void operator-= (const CDelegateBase& d);//移除委托
    void operator-= (FnType pFn);
    bool operator() (void* param);

protected:
    CDuiPtrArray m_aDelegates; //保存 委托对象 的数组
};

猜你喜欢

转载自blog.csdn.net/qq_39826592/article/details/80493161
今日推荐