boost:boost signals22:signal 能复制吗

相关文章推荐
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie讨论新闻组及文件信号和插槽系统是我想用来在游戏引擎中让各模块解耦的关键部分,虽然自己以前也写过简单的实...
在游戏编程中,新的策划需求总是在迭代不停。。。。。。,对于游戏程序员肯定深有感触吧,遇到这种情况咱只能小小的抱怨下,活还得干。尤其是遇到耦合到很多类的时候,要是直接实现不加抽象的话,那咱的代码就要被拆...
boost------signals2的使用1(Boost程序库完全开发指南)读书笔记
signals2基于Boost的另一个库signals,实现了线程安全的观察者模式。在signals2中,观察者模式被称为信号/插槽(signals and slots),它是一种函数回调机制,一个信...
Boost::Signals和Signals2的区别是Signals2是现成安全的;信号和插槽的核心目的是降低各个模块的耦合性。
first,we create a signal sig, a si...
在XShell中打开html文件出现乱码,于是首先获得了文件的编码方式,命令为:set fileencoding,获知文件编码为euc-cn后使用:set termencoding=euc-cn进行设...
我们发现了 POSIX 线程和基于 Windows 的线程的一种强大替代,即 Intel 线程构建块,该构建块是专为并行编程而设计的基于 C++ 的框架。
boost------asio库的使用2(Boost程序库完全开发指南)读书笔记
我来说两句
作者:孤独的豆沙包
boost------asio库的使用2(Boost程序库完全开发指南)读书笔记
注:文字、程序片段大部分摘录自书中。
1.scoped_ptr
1).scoped_ptr所有权严格,不能转让,一旦scoped_ptr获取了对象的管理权,你就无法再从它那里取回来。
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)推荐这篇日记的豆列
&&&&&&&&&&&&boost::signals::signal的使用方法
时间: 13:00:55
&&&& 阅读:208
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
吃力的讲完boost::signals的ppt。然后接着就是做练习题。通过讲ppt,发现有一句话说的真好:你自己知道是一回事。你能给别人讲明确又是另外一回事。真的有些东西你自己理解,可是用语言去非常难表达,是不是用语言难以表达暴露出自己对所理解的东西不是真正的理解?。。。。orz。只是讲完ppt之后,真的对boost::singals的理解又加深一层。好了废话不多说了,如今来看两个习题(ppt的内容基本上是boost官方站点介绍boost::singlas使用方法的章节,这里不贴了):
题目1:实现一个日常生活里出现的情景
描写叙述:
&&&& 客人按门铃,门铃响,护士开门,婴儿惊醒后苦恼。
&&&& 有至少两个护士和两个婴儿。而且某护士去开门是一个随机事件(随机数)。仅仅有当满足某个条件时才去开门,比方随机数randX满足500&randX%的时候才去开门,当然假设有一个护士去开门,剩下的护士就不用去开门了!门铃响。某个婴儿被惊醒也是一个随机事件。当满足一定条件时。这个婴儿醒来就哭叫。没醒的继续睡觉_~~_。
这个题就是想实现一个简单的观察这模式,假设不用boost::signals来实现,我们就得依照观察模式来写,首先肯定有一个观察者的基类,然后是n多派生观察者。其次要定义一个被观察者基类,然后就是m多被观察者,以下是一个实现:
&span style=&font-size:14&&namespace TestRing
//观察者基类
class CPerson
CPerson(const std::string& vName) : m_Name(vName) {}
virtual ~CPerson()
//观察者收到通知(触发信号)的动作
virtual void act()
std::cout&&&no action \n&;
const std::string getName() const {return m_N}
std::string m_N
//一个派生子类,实际观察者
class CNurse : public CPerson
CNurse(const std::string& vName) : CPerson(vName) {}
virtual void act() {std::cout&&&Nurse & &&getName()&&& come and open the door\n&;}
//一个派生子类。实际观察者
class CBaby : public CPerson{
CBaby(const std::string& vName) : CPerson(vName) {}
virtual void act() {std::cout&&&Baby &&&getName()&&& weak up and cry\n&;}
//被观察者基类
class CRing
CRing() {}
virtual ~CRing() {}
void ring()//触发信号
__notifyV();
//添加观察者
void add(CPerson* vPerson) {m_Person.push_back(vPerson);}
std::vector&CPerson*& m_P
//通知全部观察者
virtual void __notifyV()
std::vector&CPerson*&::iterator It = m_Person.begin();
while (It != m_Person.end()) (*It++)-&act();
class CGuest : public CRing
CGuest() {}
virtual ~CGuest() {}
void test()
CNurse Nurse(&LiSi&);
Baby(&ZhangSan&);
Guest.add(&Nurse);
Guest.add(&Baby);
Guest.ring();//触发信号
}&/span&为什么要用boost::signals呢?原因是上面这个代码耦合性强,用boost::signals能够来减少耦合性:
&span style=&font-size:14&&#pragma once
#include &algorithm&
#include &boost/ref.hpp&
#include &boost/bind.hpp&
#include &boost/signals2.hpp&
namespace Test_Signal_work
class CGate
typedef boost::signals2::signal&void(bool, const std::string&)& signal_
typedef signal_type::slot_type slot_
boost::signals2::connection connect(const slot_type& vSlot)
return m_EnterOrLiveSig.connect(vSlot);
void enter(const std::string& vCarId)
m_EnterOrLiveSig(true, vCarId);
void leave(const std::string& vCarId)
m_EnterOrLiveSig(false, vCarId);
signal_type m_EnterOrLiveS
class CCarInformation
typedef boost::signals2::signal&void(const std::string&)& signal_
typedef signal_type::slot_type slot_
typedef std::vector&std::string& cars_
boost::signals2::connection connect(const slot_type& vSlot)
return m_Sig.connect(vSlot);
void active(bool vEnter, const std::string& vCarId)
vEnter ? enter(vCarId) : leave(vCarId);
//不要这个也行,能够用boost::bind
void operator()(bool vEnter, const std::string& vCarId)
active(vEnter, vCarId);
void enter(const std::string& vCarId)
cars_type::iterator It = std::find(m_CarsInfo.begin(), m_CarsInfo.end(), vCarId);
if (It == m_CarsInfo.end())
m_CarsInfo.push_back(vCarId);
std::cout && &car & && vCarId && & enter!& && std::
m_Sig(vCarId);
void leave(const std::string& vCarId)
cars_type::iterator It = std::find(m_CarsInfo.begin(), m_CarsInfo.end(), vCarId);
if (It != m_CarsInfo.end())
std::cout && &car & && vCarId && & leave!& && std::
m_CarsInfo.erase(It);
m_Sig(vCarId);
signal_type m_S
cars_type m_CarsI
class CGuard
CGuard(const std::string& vName) : m_GuardName(vName) {}
void active(const std::string& vCarId)
std::cout && m_GuardName && & knew that & && &there is an exception with car & && vCarId && std::
void operator()(const std::string& vCarId)
active(vCarId);
std::string m_GuardN
void test_fun_1()
CGuard ZS(&ZhangSan&);
CGuard LS(&LiSi&);
CCarInformation I
CGate Gate1;
CGate Gate2;
Gate1.connect(boost::ref(Info));
Gate2.connect(boost::ref(Info));
Info.connect(LS);
Info.connect(ZS);
Gate1.enter(&CA1001&);
Gate2.enter(&CB1002&);
Gate1.leave(&CB1002&);
Gate2.leave(&CA1003&);
Gate1.enter(&CA1004&);
Gate2.enter(&CA1004&);
Gate1.leave(&CA1004&);
在看第二个样例:
题目2:模拟简单的停车场监视器
描写叙述:
车辆进入或离开停车场时,监视器将收到一个通知信息(如唯一标记这辆车的车牌号,进入或离开时间,这里仅用车牌号),这样监视器才干跟踪每两车的进入和离开,而且监视器可以在有人进行欺骗行为时出发警报通知保安。
一个简单的停车场监视器能够用三个类来实现:CGate。CCarInformation,CGuard。
enter(const
std::string&
leave(const
std::string&
CGate必须有enter和leave函数。把车辆的信息发送给CCarInformation。
CCarInformation
active(bool
vEnter, const
std::string&
&& std::vector&std::string&
m_CarsInfo;
CcarInformation收到CGate的信息时必须有一个active来採取对应的措施。比方某辆车的信息异常側发出警报通知CGuard。
active(const
std::string&
&& std::string
m_GuardName;
假设CcarInformation发出警报则CGuard必须做出反应。
要求实现功能:
&& 停车场有两个门。每一个门都能够进出。而且把车辆的出入信息通知给CCarInformation进入(或两次离开)时,发出警报通知全部保安。每一个门有一个保安。
測试例子:
&& //測试1
&& Gate1.enter(&CA1001&);
&& Gate2.enter(&CB1002&);
&& Gate1.leave(&CB1002&);
&&& //測试2
&& Gate2.leave(&CA1003&);
&& Gate1.enter(&CA1004&);
&& Gate2.enter(&CA1004&);
&& Gate1.leave(&CA1004&);
測试1输出:
&& car CA1001 enter!
&& car CB1002 enter!
&& car CB1002 leave!
測试2输出:
&& ZhanSan knew that there is an exception with car CA1003!
&& LiSi knew that there is an exception with car CA1003!
&& car CA1004 enter!
&& ZhanSan knew that there is an exception with car CA1004!
&& LiSi knew that there is an exception with car CA1004!
&& car CA1004 leave!
这个样例比前一个样例略微复杂:
#pragma once
#include &algorithm&
#include &boost/ref.hpp&
#include &boost/bind.hpp&
#include &boost/signals2.hpp&
namespace Test_Signal_work
class CGate
typedef boost::signals2::signal&void(bool, const std::string&)& signal_
typedef signal_type::slot_type slot_
boost::signals2::connection connect(const slot_type& vSlot)
return m_EnterOrLiveSig.connect(vSlot);
void enter(const std::string& vCarId)
m_EnterOrLiveSig(true, vCarId);
void leave(const std::string& vCarId)
m_EnterOrLiveSig(false, vCarId);
signal_type m_EnterOrLiveS
class CCarInformation
typedef boost::signals2::signal&void(const std::string&)& signal_
typedef signal_type::slot_type slot_
typedef std::vector&std::string& cars_
boost::signals2::connection connect(const slot_type& vSlot)
return m_Sig.connect(vSlot);
void active(bool vEnter, const std::string& vCarId)
vEnter ? enter(vCarId) : leave(vCarId);
//不要这个也行,能够用boost::bind
void operator()(bool vEnter, const std::string& vCarId)
active(vEnter, vCarId);
void enter(const std::string& vCarId)
cars_type::iterator It = std::find(m_CarsInfo.begin(), m_CarsInfo.end(), vCarId);
if (It == m_CarsInfo.end())
m_CarsInfo.push_back(vCarId);
std::cout && &car & && vCarId && & enter!& && std::
m_Sig(vCarId);
void leave(const std::string& vCarId)
cars_type::iterator It = std::find(m_CarsInfo.begin(), m_CarsInfo.end(), vCarId);
if (It != m_CarsInfo.end())
std::cout && &car & && vCarId && & leave!& && std::
m_CarsInfo.erase(It);
m_Sig(vCarId);
signal_type m_S
cars_type m_CarsI
class CGuard
CGuard(const std::string& vName) : m_GuardName(vName) {}
void active(const std::string& vCarId)
std::cout && m_GuardName && & knew that & && &there is an exception with car & && vCarId && std::
void operator()(const std::string& vCarId)
active(vCarId);
std::string m_GuardN
void test_fun_1()
CGuard ZS(&ZhangSan&);
CGuard LS(&LiSi&);
CCarInformation I
CGate Gate1;
CGate Gate2;
Gate1.connect(boost::ref(Info));
Gate2.connect(boost::ref(Info));
Info.connect(LS);
Info.connect(ZS);
Gate1.enter(&CA1001&);
Gate2.enter(&CB1002&);
Gate1.leave(&CB1002&);
Gate2.leave(&CA1003&);
Gate1.enter(&CA1004&);
Gate2.enter(&CA1004&);
Gate1.leave(&CA1004&);
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/bhlsheji/p/5098284.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!

我要回帖

更多关于 c boost signal 的文章

 

随机推荐