• 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

C++ 回调函数

C++ 发布于2020-09-23 阅读 6,330次 0次评论 0次点赞 本文共1455个字,阅读需要4分钟。

回调函数其实就是以函数指针做函数参数传递给另一个函数,在另一个函数执行的时候可以根据函数指针执行回调函数的代码。

以下介绍两种回调函数的形式,
- 一种是简单的以函数指针传递的形式
- 另一种是C++11特性的std::bindstd::function来实现更加简单的回调函数

1 函数指针

简单示例,便于理解,防止遗忘。

#include <iostream>

typedef double (*CallbackFunction)(double a, double b); // 回调函数指针


void CallCallbackFunction(CallbackFunction p_Function) // 调回调函数
{
    CallbackFunction tempCallFunction = NULL;
    tempCallFunction = p_Function;

    double sum = tempCallFunction(1, 3);
    std::cout << "CallbackFunction 的回调结果=" << sum << std::endl;
}

double Add(double a, double b) // 回调函数
{
    return a + b;
}

int main()
{
    CallCallbackFunction(Add);
    getchar();
    return 0;
}

2 std::bind和std::function实现回调函数

简单示例,避免遗忘

#include <iostream>
#include <functional>
#include <memory>
#include <thread>

using namespace std;

typedef std::function<void(int a,int b)> AddFunc;

class A
{
public:
    typedef std::shared_ptr<A> ptr;
    A()
    {
    };
    virtual~A()
    {

    };

public:
    void SetAddFunc(AddFunc func)
    {
        m_AddFunc = func;
    }

    void AddThread()
    {
        std::shared_ptr<std::thread> threadPtr = std::make_shared<std::thread>([this]() {

            int count = 0;
            while (count<10)
            {
                std::this_thread::sleep_for(std::chrono::milliseconds(1000));
                if (m_AddFunc != nullptr)
                {
                    m_AddFunc(1, 2);
                    count += 1;
                }

            }

        });
        threadPtr->join();
    }

private:
    AddFunc m_AddFunc;
};

class B
{
public:
    B()
    {
        if (m_pAPtr == nullptr)
        {
            m_pAPtr = std::make_shared<A>();
            if (m_pAPtr != nullptr)
            {
                m_pAPtr->SetAddFunc(std::bind(&B::AddFuncCallback, this, std::placeholders::_1, std::placeholders::_2));
                m_pAPtr->AddThread();
            }       
        }
    };
    virtual~B()
    {

    }
private:
    void AddFuncCallback(int a, int b)
    {
        std::cout << "A的函数回调" << std::endl;
    };
private:
    A::ptr m_pAPtr;
};


int main()
{
    B t_B;

    return 0;
}

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ 回调函数

原文链接:https://www.stubbornhuang.com/915/

发布于:2020年09月23日 16:43:10

修改于:2023年06月26日 22:15:55

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
工具网站推荐 - 获取本机外网IP
工具软件网站
下一篇
C++11 - std::function简要介绍以及可包装函数的几种形式总结
C++
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号