写个信号与槽的框架, 要求槽函数可以使用普通函数成员函数, 用C++
时间: 2024-01-01 13:04:08 浏览: 96
c++实现的信号-槽机制程序(非boost库)
3星 · 编辑精心推荐
好的,我可以为您提供一个简单的信号与槽框架的示例代码,满足您的要求。以下是一个使用 C++ 的示例:
```cpp
#include <iostream>
#include <functional>
#include <map>
#include <vector>
// 信号类
class Signal {
public:
// 连接槽函数
void connect(const std::function<void()>& slot) {
slots.push_back(slot);
}
// 发送信号
void emit() {
for (const auto& slot : slots) {
slot();
}
}
private:
std::vector<std::function<void()>> slots;
};
// 槽类
class SlotClass {
public:
void memberFunction() {
std::cout << "This is a member function." << std::endl;
}
};
// 普通函数作为槽函数
void normalFunction() {
std::cout << "This is a normal function." << std::endl;
}
int main() {
Signal signal;
// 创建槽对象
SlotClass slotObject;
// 使用槽对象的成员函数作为槽函数
signal.connect(std::bind(&SlotClass::memberFunction, &slotObject));
// 使用普通函数作为槽函数
signal.connect(normalFunction);
// 发送信号,执行槽函数
signal.emit();
return 0;
}
```
这个示例中,Signal 类代表一个信号,它可以连接多个槽函数,并且可以通过 emit() 函数发送信号,触发所有连接的槽函数。SlotClass 是一个包含成员函数的类,它的 memberFunction() 函数作为槽函数被连接到了信号上。另外,normalFunction() 是一个普通函数,也被连接到了信号上。
在示例的 main() 函数中,我们创建了一个 Signal 实例 signal,并创建了一个 SlotClass 实例 slotObject。然后,通过 std::bind 将 slotObject 的成员函数绑定为一个可调用对象,并使用 connect() 函数将它连接到 signal。同时,我们也将 normalFunction 直接传递给 connect() 函数进行连接。最后,通过调用 signal 的 emit() 函数,触发信号,执行所有连接的槽函数。
希望这个示例能够满足您的需求!如果有任何问题,请随时提问。
阅读全文