Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
c++怎么实现一个简单的信号槽机制_c++信号与槽机制的实现与应用_创想鸟

c++怎么实现一个简单的信号槽机制_c++信号与槽机制的实现与应用

答案:通过std::function和可变模板参数实现支持多类型槽函数的信号机制,具备连接管理与解耦特性。

c++怎么实现一个简单的信号槽机制_c++信号与槽机制的实现与应用

在C++中实现一个简单的信号与槽机制,核心目标是解耦对象之间的通信。Qt框架中的信号槽非常经典,但不依赖Qt时,我们可以通过现代C++(如C++11及以上)的特性,比如std::function、可变模板参数和std::shared_ptr来实现一个轻量级版本。

基本设计思路

信号(Signal)是一个事件发生的通知者,槽(Slot)是响应这个事件的函数。我们需要做到:

一个信号可以绑定多个槽函数 支持普通函数、成员函数、lambda表达式作为槽 连接管理:能断开连接或自动清理无效连接

这里采用基于std::function存储回调,并用连接ID管理订阅关系。

简易信号类实现

定义一个模板类Signal,支持任意参数的函数签名:

立即学习“C++免费学习笔记(深入)”;

#include #include #include template class Signal {private:    using SlotType = std::function;    std::vector slots_;    int next_id_ = 0;    std::vector free_ids_;public:    // 连接一个槽函数,返回连接ID    int connect(SlotType slot) {        int id;        if (free_ids_.empty()) {            id = next_id_++;            slots_.push_back(slot);        } else {            id = free_ids_.back();            free_ids_.pop_back();            slots_[id] = slot;        }        return id;    }    // 断开连接    void disconnect(int id) {        if (id >= 0 && id < (int)slots_.size() && slots_[id]) {            slots_[id] = nullptr;            free_ids_.push_back(id);        }    }    // 触发信号,调用所有有效槽    void emit(Args... args) {        for (const auto& slot : slots_) {            if (slot) {                slot(args...);            }        }    }};

使用示例

下面演示如何连接普通函数、lambda和成员函数:

#include struct Receiver {    void onEvent(int value) {        std::cout << "Received: " << value << "n";    }};void globalCallback(int value) {    std::cout << "Global handler: " << value << "n";}int main() {    Signal sig;    Receiver receiver;    // 连接全局函数    int conn1 = sig.connect(globalCallback);    // 连接lambda    int conn2 = sig.connect([](int v) {        std::cout << "Lambda received: " << v << "n";    });    // 连接成员函数(注意捕获receiver实例)    int conn3 = sig.connect([&receiver](int v) {        receiver.onEvent(v);    });    // 发送信号    sig.emit(42);    // 断开某个连接    sig.disconnect(conn2);    std::cout << "After disconnecting lambda:n";    sig.emit(100);    return 0;}

输出结果:

Global handler: 42Lambda received: 42Received: 42After disconnecting lambda:Global handler: 100Received: 100

改进方向与注意事项

当前实现简单实用,但可用于生产环境前建议增强以下几点:

线程安全:在多线程环境中,对slots_的访问应加锁(如std::mutex) 自动释放:若槽函数持有对象引用,对象销毁后应自动断开连接。可通过std::weak_ptr检测生命周期 连接管理器:引入Connection类,支持RAII自动断开 性能优化:避免频繁内存分配,可用对象池管理连接ID

基本上就这些。这个轻量级信号槽机制适合嵌入小型项目或学习事件驱动编程模型,不复杂但足够灵活。

以上就是c++++怎么实现一个简单的信号槽机制_c++信号与槽机制的实现与应用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1482124.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++如何将string转换为char_C++ string转char方法
上一篇 2025年12月19日 06:06:34
c++怎么自定义STL容器的分配器_C++ STL自定义Allocator实现与优化内存管理
下一篇 2025年12月19日 06:06:46

相关推荐

发表回复

登录后才能评论
关注微信