回调函数,类和类之间通信

在C++中,回调函数是一种常见的实现类之间通信的方法。回调函数可以让一个类在其内部方法中调用另一个类提供的函数,从而实现在不同类之间传递消息、触发事件或共享处理逻辑。以下是一个简单示例,说明如何使用函数指针实现类之间的回调:

#include <iostream>

// 定义一个回调函数的原型
typedef void (*CallbackFunction)(int data);

// 假设我们有一个类A,它需要在某个事件发生时通知其他类
class ClassA {
public:
    void setCallback(CallbackFunction callback) {
        this->callback = callback;
    }

    void triggerEvent(int someData) {
        if (callback != nullptr) {
            callback(someData);  // 当事件触发时,调用回调函数
        }
    }

private:
    CallbackFunction callback = nullptr;
};

// 另一个类B,想要在ClassA的事件发生时得到通知
class ClassB {
public:
    void onEvent(int data) {
        std::cout << "ClassB received event with data: " << data << std::endl;
    }
};

int main() {
    ClassA objA;
    ClassB objB;

    // 将ClassB的成员函数作为回调函数赋值给ClassA
    objA.setCallback(&ClassB::onEvent);

    // 当事件触发时,实际上是调用了ClassB的onEvent方法
    objA.triggerEvent(123);

    return 0;
}

// 注意:上述例子中ClassB::onEvent需要修改为静态成员函数才能直接作为函数指针使用
// 若要绑定到非静态成员函数,可以考虑使用std::function结合std::bind或者lambda表达式

为了能将类B的非静态成员函数作为回调,可以使用std::functionstd::bind来包装成员函数:

#include <iostream>
#include <functional>

class ClassA {
public:
    typedef std::function<void(int)> CallbackFunction;

    void setCallback(const CallbackFunction& callback) {
        this->callback = callback;
    }

    void triggerEvent(int someData) {
        if (callback) {
            callback(someData);
        }
    }

private:
    CallbackFunction callback;
};

class ClassB {
public:
    void onEvent(int data) {
        std::cout << "ClassB received event with data: " << data << std::endl;
    }
};

int main() {
    ClassA objA;
    ClassB objB;

    // 使用std::bind绑定类B的对象与其成员函数
    auto boundFunction = std::bind(&ClassB::onEvent, &objB, std::placeholders::_1);

    objA.setCallback(boundFunction);

    objA.triggerEvent(456);

    return 0;
}

// 或者更简洁地使用lambda表达式:
// objA.setCallback([&objB](int data){ objB.onEvent(data); });

在这个例子中,ClassA接收一个std::function类型的回调函数,并在触发事件时调用它。ClassB通过使用std::bind将其成员函数onEvent绑定到特定对象后传递给ClassA,实现了类间的通信。使用lambda表达式可以达到同样的目的,而且更为简洁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

折戟不必沉沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值