程序开发基础学习四(boost::signal2 函数学习)

        在游戏编程中,新的策划需求总是在迭代不停。。。。。。,对于游戏程序员肯定深有感触吧,遇到这种情况咱只能小小的抱怨下,活还得干。尤其是遇到耦合到很多类的时候,要是直接实现不加抽象的话,那咱的代码就要被拆的七零八落,并且在代码维护性和程序健壮性上问题很大。前面说到的问题其实就是常听到的代码耦合,说白了就是在原有的代码上插上一段代码。而signal就能很好的解决这种问题。这样不仅可以让咱的代码优美,而且修改的时候也很方便。好的,按照惯例先模拟一下signal的实现方法。看清它的真面目,也就不用害怕了。

1、signal模拟程序

#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
#include "boost/signals2.hpp"
using namespace std;
using namespace boost;
class Buttion
{
public:void connect(void (*f)(int, int));void OnBtnClick();
private:void (*fuc_)(int, int);
};void Buttion::connect(void (*f)(int, int))
{fuc_ = f;
}
void Buttion::OnBtnClick()
{fuc_(10, 20);
}
void PrintCodeline(int x, int y)
{cout<<"x:"<<x<<",y:"<<y<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{Buttion btn;btn.connect(&PrintCodeline);btn.OnBtnClick();getchar();return 0;
}

         看见了吗?其实就是传递个函数指针,不过signal用的是template而已,并且里面还有一些保护机制。在下面的程序会提到。

2、signal函数实现

#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
#include "boost/signals2.hpp"
using namespace std;
using namespace boost;
class Buttion
{typedef signals2::signal<void (int ,int)> OnClick;
public:typedef OnClick::slot_type OnSlottype;signals2::connection connect(const OnSlottype& type);void OnBtnClick();
private:OnClick onclick_;signals2::connection connect_;
};signals2::connection Buttion::connect(const OnSlottype& type)
{return connect_ = onclick_.connect(type);
}
void Buttion::OnBtnClick()
{onclick_(10, 20);
}
void PrintCodeline(int x, int y)
{cout<<"x:"<<x<<",y:"<<y<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{Buttion btn;btn.connect(&PrintCodeline);btn.OnBtnClick();getchar();return 0;
}
        重点有两个方面,一个是OnSlottype,其实就相当于上一个列子中的函数指针,在一个要问为什么要返回成员变量connect_,一个原因是通过它的返回值可以知道是否connect成功,另一个在用完之后调用disconnect方法,释放connect_变量。

3、类之间相互调用

// mercurial.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
#include "boost/ref.hpp"
#include "boost/shared_ptr.hpp"
#include "boost/signals2.hpp"
using namespace std;
using namespace boost;
class Document
{typedef signals2::signal<void (void)> signal_t;
public:Document(){}signals2::connection connect(const signal_t::slot_type &subscriper){return sig_.connect(subscriper);}void Append(const char* text){text_ += text;sig_();}string GetText(){return text_;}
private:signal_t sig_;string text_;
};
class TextView
{
public:TextView(Document* doc):doc_(doc){connect_ = doc_->connect(bind(&TextView::Refresh, this));}~TextView(){connect_.disconnect();}void Refresh(){cout<<doc_->GetText()<<endl;}
private:signals2::connection connect_;Document* doc_;
};class HexView
{
public:HexView(Document* doc):doc_(doc){connect_ = doc_->connect(bind(&HexView::Refresh, this));}~HexView(){connect_.disconnect();}void Refresh(){string str = doc_->GetText();for (size_t i = 0; i < str.size(); ++i){cout<<(int)str[i];}cout<<endl;}
private:Document* doc_;signals2::connection connect_;
};
int _tmain(int argc, char* argv[])
{Document *doc = new Document();TextView text(doc);HexView hex(doc);doc->Append(argc == 2 ? argv[1] : "Hello,Word.");delete doc;getchar();return 0;
}

       这个程序模仿boost给出的示例写的,要注意的是在TextView和HexView两个构造函数传递的是Document的指针,之前我自己写的时候传递的是Document的复制,但是编译不过。signal自己有不允许复制的机制。这就很强大了,本来是粗心造成的一个问题(复制的话,就不能改变传递的参数了),signal在编译的时候就能检测出问题了。有点只能的感觉了。再一个在main函数里我只申明TextView和HexView两个对象。调用下Document的一个函数,就将TextView和HexView的函数都别调用了。这不就是传说中的“杀人”于无形中,这样很大程度上封装了函数,简化了表现层的复杂度。

转载于:https://www.cnblogs.com/fengju/archive/2011/07/18/6174340.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

array.tolist_在Python中使用array.tolist()将数组转换为列表

array.tolistGiven an array with some elements and we have to convert them to the list using array.tolist() in Python. 给定一个包含一些元素的数组&#xff0c;我们必须使用Python中的array.tolist()将它们转换为列表。 创建一个数组 (Creating an array) To create a…

利用xor给shellcode加壳

首先看我们的shellcode&#xff0c;执行弹出cmd 没有shellcode&#xff1a; #include "stdio.h" #include "windows.h" #include <string.h> #include "stdlib.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTAN…

华为mate50鸿蒙,华为Mate50Pro首次曝光,5000mAh+鸿蒙OS+120Hz,太强

自从去年九月份以来&#xff0c;关于华为旗舰的消息越来越少了&#xff0c;主要的原因想必大家也是知道的。现在华为究竟还能不能继续正常发布新旗舰&#xff0c;答案也很微妙&#xff0c;不过我们可以肯定的是&#xff0c;华为绝不会放弃手机业务&#xff0c;这是余承东多次亲…

数数小木块

描述 在墙角堆放着一堆完全相同的正方体小木块&#xff0c;如下图所示&#xff1a; 因为木块堆得实在是太有规律了&#xff0c;你只要知道它的层数就可以计算所有木块的数量了。 现在请你写个程序 给你任一堆木块的层数&#xff0c;求出这堆木块的数量. 输入 第一行是一个整…

sql server 2000 以前的某个程序安装已在安装计算机上创建挂起的文件操作解

好久没弄VS了&#xff0c;今天因为要改客户的网站&#xff0c;又装起来VS2003&#xff0c;先要装一下MSSQL&#xff0c;忘了原先自己的电脑不能装MSSQL企业版&#xff0c;今天下了个企业版&#xff0c;才知道白下了&#xff0c;装不起来&#xff0c;后来又弄了个MSSQL ED 版&am…

HDOJ 1896 Stones 解题报告

题目分类&#xff1a;优先队列STL作者&#xff1a;ACShiryu做题时间&#xff1a;2011-7-18Stones Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 217 Accepted Submission(s): 107 Problem DescriptionBecause…

信息安全主动攻击和被动攻击_信息安全中的主动和被动攻击 网络安全

信息安全主动攻击和被动攻击安全攻击 (Security Attacks) The attack in cryptography means that our data or sent messages or any kind of information is accessed by some anonymous user without our permission. An attack simply means to alter, destroy, implant or…

小光棍数

描述 最近Topcoder的XD遇到了一个难题&#xff0c;倘若一个数的三次方的后三位是111&#xff0c;他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111&#xff0c;现在他想知道第m&#xff08;m<10000000000&#xff09;个小光棍数是多少&a…

线性表---双链表

双链表是单链表的拓展&#xff0c;单链表结点中只有一个指向其后继的指针&#xff0c;双链表有两个结点&#xff0c;一个指向其后继的指针&#xff0c;另一个指向前驱。 为什么要引入双链表呢&#xff1f; 这就要说单链表只有一个指针了&#xff0c;使得单链表只能从结点依次顺…

ppt形状html,PPT如何才能高大上?“形状”在PPT有这些妙用

【PConline 技巧】在PPT中&#xff0c;形状的用法非常丰富。可以说一份优秀的PPT&#xff0c;随处都能见到形状的影子。今天我们就和大家分享几组形状的特殊用法。其实很多时候&#xff0c;你会发现形状有时并不仅仅是形状&#xff01;1.突出标题标题在PPT中的作用不言而喻&…

用随机整数填充缺失值_输入一个整数值并在C中用零填充进行打印

用随机整数填充缺失值Input an integer value and we have to pad the value by Zeros in C. 输入一个整数值&#xff0c;我们必须在C中用零填充该值。 Example: 例&#xff1a; Input:Enter an integer value: 12 Output: 2 digit padding: 123 digit padding: 0124 digit p…

二分图匹配----匈牙利算法之二

poj 1469 COURSES//题意:现在有p门课程和n个学生,现在需要有由p个学生组成的组织,该组织满足每个学生代表一门课程以及每门课程只能由一个学生代表,//现给出每门课程都有哪些学生可以参加,要求判断是否存在满足题意所需要的组织.//求解二分图的最大匹配数,如果与p相等就输出&qu…

FileSystemObject简介及应用

提示:刚一开始看到有这样的功能&#xff0c;我也受骗了&#xff0c;以为真的可以通过浏览器在访问者的硬盘上创建文件&#xff0c;因为我开始试了一下真的可以&#xff0c;不信你把下面这段代码COPY到一个HTML文件当中再运行一下&#xff01; <script language"JavaScr…

C——画图

描述 计算机画图也挺有趣的哈&#xff01;那我们就来用计算机画幅图吧。。。 输入 输入一个正整数N&#xff08;0< N<10&#xff09;&#xff0c;表示要输出的正方形的边上*的个数 输出 输出一个满足题意的正方形 样例输入 4 样例输出 **** **** **** **** …

线性表----循环链表和静态链表

1、循环链表 1.1 循环单链表 循环单链表和单链表的区别在于&#xff0c;表中最后一个结点指针不在是null&#xff0c;而是头指针&#xff0c;从而使整个链表形成一个环 此时判断单链表是否为空&#xff0c;条件就是头结点的指针是否等于头指针此时单链表相当于一个环&#…

html下拉框选中第二个,html通过点击第一个select改变第二关select的内容

地址联动select {width: 100px;padding: 5px;font-size:16px;}选择地址//定义省市的信息var provList [‘江苏‘,‘浙江‘,‘福建‘,‘湖南‘];var cityList [];cityList[0] [‘南京‘, ‘苏州‘, ‘宿迁‘, ‘扬州‘];cityList[1] [‘杭州‘, ‘温州‘, ‘宁波‘, ‘台州‘…

关于Asp.Net开发中导入外部JavaScript文件的问题

一直认为在html元素应用的时候&#xff0c;每个元素大都这样子(<hr />或者<script />)格式就对的&#xff0c;但今天就发现了&#xff0c;其实在不同的开发中是不一样的&#xff0c;这次遇到的就是导入外部Js文件的问题。之前我是如此写的&#xff1a; <script …

n个节点的二叉树n+1_使用C ++程序将链接列表中的最后N个节点附加到第一个

n个节点的二叉树n1Given a linked list and an integer n, append the last n elements of the LL to front. Assume given n will be smaller than length of LL. 给定一个链表和一个整数n&#xff0c;将LL的最后n个元素附加到前面。 假设给定的n将小于LL的长度。 Input form…

生活更多仓桑。

吃完房&#xff0c;到了房间&#xff0c;又把音乐开的最大声。听听一些呐感不平&#xff0c;可以发泄情感的歌。 现在听的是《浪人情歌》&#xff0c;不要再承受&#xff0c;要把你忘记。这些年来&#xff0c;自已为了她真的是付出了很多&#xff0c;但结果还是这样&#xf…

利用kali的msf提取汇编机器码(shellcode)

对于提取小段汇编的机器码&#xff0c;kali的msf提取汇编机器码非常方便 比如提取下面小段的汇编机器码 push 5 ;5SW_SHOWpush eaxmov eax,0x755bdab0call eax首先输入 msf-nasm_shell //注意msf和-之间没有空格然后依次输入命令 将上面内容复制到一个文本编辑器里&#x…