C++回调机制

Posted RainyBear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++回调机制相关的知识,希望对你有一定的参考价值。

一直对回调机制不是很了解,今天索性搜了很多资料顺便整理一下,进步一点点。

1.Callback方式(回调函数)

  什么是回调函数?

  简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

typedef void (__stdcall *DownloadCallback)(const char* pURL, bool bOK);  
void DownloadFile(const char* pURL, DownloadCallback callback)  
{  
    cout << "downloading: " << pURL << "" << endl;  
    callback(pURL, true);  
}  
void __stdcall OnDownloadFinished(const char* pURL, bool bOK)  
{  
    cout << "OnDownloadFinished, URL:" << pURL << "    status:" << bOK << endl;  
}
//初始化
DownloadCallback = OnDownloadFinished;

  回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法

2.虚拟方法

  本质是你按照对方要求实现一个C++接口,然后把你实现的接口设置给对方,对方需要触发事件时调用该接口

class IDownloadSink
{
public:
    virtual void OnDownloadFinished(const char* pURL, bool bOK) = 0;
};


class CMyDownloader
{
public:
    CMyDownloader(IDownloadSink* pSink)
        :m_pSink(pSink)
    {
    }

    void DownloadFile(const char* pURL)
    {
        cout << "downloading: " << pURL << "" << endl;
        if(m_pSink != NULL)
        {
            m_pSink->OnDownloadFinished(pURL, true);
        }
    }

private:
    IDownloadSink* m_pSink;
};

class CMyFile: public IDownloadSink
{
public:
    void download()
    {
        CMyDownloader downloader(this);
        downloader.DownloadFile("www.sina.com");
    }

    virtual void OnDownloadFinished(const char* pURL, bool bOK)
    {
        cout << "OnDownloadFinished, URL:" << pURL << "    status:" << bOK << endl;
    }
};

这里使用多态,子类指针实例化父类指针。

以上是关于C++回调机制的主要内容,如果未能解决你的问题,请参考以下文章

细数Objective-C中的回调机制

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

c++实现Callback机制

Facebook状态回调不适用于片段

c++中的纯虚函数机制如何从DLL中暴露函数

C++中事件机制的简洁实现