C语言自定义信号与槽,推荐大家一个好用的C++ 信号槽机制

熟悉QT的朋友相信大家对QT中简单易用的信号和槽有很深刻的印象,在这里推荐一个可移植的C++信号量传递,

sigslot是一个线程安全、类型安全,用C++实现的sig/slot机制(sig/slot机制就是对象之间发送和接收消息的机制)的开源代码库。是一个非常好用的库,只有一个头文件sigslot.h

下面给个例子

比如:我们有一个switch类和一个light类,而我们现在需要将两者关联起来,即通过switch控制light的状态,我们可能需要添加一个另外的类ToggleSwitch来将两者关联起来:

class Switch

{

public:

virtual void Clicked() = 0;

};

class Light

{

public:

void ToggleState();

void TurnOn();

void TurnOff();

};

class ToggleSwitch : public Switch

{

public:

ToggleSwitch(Light& lp){m_lp = lp;}

virtual void Clicked(){m_lp.ToggleState();}

private:

Light& m_lp;

};

Light lp1, lp2;

ToggleSwitch tsw1(lp1), tsw2(lp2);

这在功能上完全可以实现,但想象一下如果大量的需要相互交互消息的类,那工作量就不是一般的大了。

使用sig/slot机制来解决上述情况,不需要关心关联类的接口细节,sigslot实现的switch和light上述功能如下:

class Switch

{

public:

signal0<> Clicked;

};

class Light : public has_slots<>

{

public:

void ToggleState();

void TurnOn();

void TurnOff();

};

Switch sw1, sw2;

Light lp1, lp2;

Sigslot机制实现该功能与第一种方法相比,switch类多了个signal0成员,light类需要从has_slots<>继承,其他没有什么变化,但省去了编写继承类用来实现两者关联的ToggleSwitch。

下面是实现功能的简单代码。

#include

using namespace std;

#include "sigslot.h"

using namespace sigslot; //必须加上sigslot的命名空间

//在用vs调试时还需要将sigslot.h中很多的自定义模板结构类型前加typename

const int TRUE = 1;

const int FALSE = 0;

class Switch

{

public:

signal0<> Clicked;

//这里的信号是不带参数的,signaln表示带几个参数

};

class Light : public has_slots<>

{

public:

Light(bool state){b_state = state;Displaystate();}

void ToggleState(){b_state = !b_state;Displaystate();} //作为消息的响应

void TurnOn(){b_state = TRUE;Displaystate();}

void TurnOff(){b_state = FALSE;Displaystate();}

void Displaystate(){cout<

private:

bool b_state;

};

void main()

{

Switch sw1, sw2,all_on,all_off;

Light lp1(TRUE), lp2(FALSE);

sw1.Clicked.connect(&lp1,&Light::ToggleState); //绑定

sw2.Clicked.connect(&lp2,&Light::ToggleState);

all_on.Clicked.connect(&lp1,&Light::TurnOn);

all_on.Clicked.connect(&lp2,&Light::TurnOn);

all_off.Clicked.connect(&lp1,&Light::TurnOff);

all_off.Clicked.connect(&lp2,&Light::TurnOff);

sw1.Clicked();

sw2.Clicked();

all_on.Clicked();

all_off.Clicked();

sw1.Clicked.disconnect(&lp1);

sw2.Clicked.disconnect(&lp2);

all_on.Clicked.disconnect(&lp1);

all_on.Clicked.disconnect(&lp2);

all_off.Clicked.disconnect(&lp1);

all_off.Clicked.disconnect(&lp2);

}

eddc9a0618bc3b57b955bf9d8fb61c71.gif

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值