随笔分类 - C++
摘要:## 1. 安装使用### 1.1 安装在https://code.google.com/p/googletest/ 下载源码进入msvc, 注意编译方式, 如果是dll, 选择 gtest-md编译生成lib文件, 然后引入.文件即可使用### 1.2 使用 #include "gtest...
阅读全文
摘要:cef支持各种语言和多种操作系统。在设计的时候充分考虑了性能和易用性。cef核心功能提供了c和c++的接口。cef提供了和主程序之间的通信能力(利用 custom plugins, protocols,javascrpit object 和 javascript extensions)。主应用程序可...
阅读全文
摘要:## 介绍cef 是一个基于google chromiun的简单的框架。 它主要是作为一个内嵌浏览器嵌入到客户端应用程序中。可以再 http://cefbuilds.com 下载最新的编译版本。## 总体框架预览1. CEF 使用了多进程。主进程是“browser”进程。 而子进程是由rederes...
阅读全文
摘要:###1. 异常介绍在函数在执行过程中如果碰到对错误的处理可以有两种方式, 1. 返回错误,2. 使用异常。 如果作为函数的调用者想要知道具体的错误信息, 就需要维护一套错误列表, 或者用string类型的返回。显然这两种使用起来都不那么方便。C++中处理异常的过程是这样的:在执行程序发生异常,可以...
阅读全文
摘要:###预备知识1. 字符:抽象的最小文本单位。仅代表符合没有实际意义(如:¥, a, 国)2. 字符集:字符的集合(如gb2312, ASCII, UNICODE)3. 编码:是对字符集的描述,计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。 如:utf-7,u...
阅读全文
摘要:#boost源码剖析----boost::any有的时候我们需要有一个万能类型来进行一些操作,这时候boost::any就派上用场了。 boost::Any testInt(10); int val = static_cast(testInt);用法比较简单,我们来研究下boost::any是如何实...
阅读全文
摘要:## c++ type_info and typeid### typeid 关键字typeid提供了对一个对象查询类型的功能。 该关键字和dynami_cast一起提供了c++的RTTI(rumtime type identification)支持. ---------- struct MyStru...
阅读全文
摘要:1.为什么需要插件化系统 “编程就是构建一个一个自己的小积木, 然后用自己的小积木搭建大系统”。 但是程序还是会比积木要复杂, 我们的系统必须要保证小积木能搭建出大的系统(必须能被组合),有必须能使各个积木之间的耦合降低到最小。 传统的程序结构中也是有模块的划分,但是主要有如下几个缺点: ...
阅读全文
摘要:“Make simple things easy.” -- Larry Wall c++中,写一个循环去迭代一个序列是很单调的。1 string hello("hello, boost!");2 3 for (int i = 0; i != hello.size(); ++i) 4 { 5 cout<<hello.at(i); 6 } 我们可以用std:for_each,但是这样并没有减少代码了,而且让很多功能分离太远 1 void print (char ch) 2 { 3 cout << ch; 4 } 5 int _tmain(int argc
阅读全文
摘要:单件模式是设计模式中最简单的模式了。 定义: 确保一个类只有一个实例,并提供一个全局的访问点。把一个类设计成自己管理的一个单独实例,同时避免其他类再自行生成实例(所以构造函数用protect或privite)也提供全局的访问点。public函数 看下代码的实现: 1 class Singleton 2 { 3 protected: 4 Singleton(){}; 5 public: 6 ~Singleton(){}; 7 8 static shared_ptr<Singleton> getInstance() 9 { 10 if (!pInstance_.g...
阅读全文
摘要:1. 场景 假设有如下的场景: 卖pizza的, 可以有很多种pizza(CheesePizza, GreekPizza, PepperoniPizza),我们该如何处理它呢,当然我们可以声明一个类,类中创建每一个种类的pizza。但是这样有什么问题吗?我们没有把需要改变的部分剥离出来。软件设计的一个原则就是“是易于扩充而不是修改”,另一个是“对接口编程而不是对实现编程”。 这里就轮到工厂模式出手了。 工厂模式有三种:简单工厂抽象工厂工厂方法2. 简单工厂模式 1.1 Uml 1.2 源代码 1 class Pizza 2 { 3 public: 4 Pizza(){}; 5 virtual
阅读全文
摘要:想象一下有如下的场景: 有两种主咖啡, 可以搭配任意的饮料,我们的目标是允许类容易扩展,在不修改现有代码的情况下,可以搭配新的行为。这里可以用装饰者模式来实现。1. uml 图 装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 这里吹一下装饰者模式的好处:每个组件都可以单独使用,或者被装饰者包装起来使用装饰者可以扩展组件的状态装饰可以加上新的方法可以为组件添加新的方法而用修改装饰者,反之亦可2. 代码示例 首先构造基类1 class Beverage 2 { 3 public: 4 virtual int cost() = 0; 5 }; 然后 定义组.
阅读全文
摘要:假设一个数据有三个部分显示数据的, 分别是 max, min,average,我们可以写下这个一个类: 1 class Datashow 2 { 3 public: 4 void measurmentChanged 5 { 6 float temp = getTemplate(); 7 float humidity = getHumdity(); 8 float pressure = getPressure(); 9 10 average.updata(temp, humidity, pressure); 11 max.updata(temp, humidity, pressure); 12.
阅读全文
摘要:这篇文章主要介绍 boost中的智能指针的使用。 内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针。垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案。1. 定义 一个智能指针就是一个C++的对象, 这对象的行为像一个指针,但是它却可以在其不需要的时候自动删除。注意这个“其不需要的时候”, 这可不是一个精确的定义。这个不需要的时候可以指好多方面:局部变量退出函数作用域、类的对象被析构……。所以boost定义了多个不同的智能指针来管理不同的场景。shared_ptrT内部维护一个引用计数器来判断此指针是不是需要被释
阅读全文
摘要:本片文章主要介绍boost::function的用法。 boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象。1. 介绍 Boost.Function 库包含了一个类族的函数对象的包装。它的概念很像广义上的回调函数。其有着和函数指针相同的特性但是又包含了一个调用的接口。一个函数指针能够在能以地方被调用或者作为一个回调函数。boost.function能够代替函数指针并提供更大的灵活性。2. 使用 Boost.Function 有两种形式:首选形式和便携式形式, 其语法如下:首选形式便携式形式boost::functionfloat(int
阅读全文
摘要:这篇文章介绍boost::bind()的用法, 文章的主要内容是参考boost的文档。1. 目的 boost::bind 是std::bindlist 和 std::bind2nd的结合体。它提供一个任意的函数对象(仿函数)、函数、函数指针、成员函数指针。 它可以绑定任意的参数。bind 没有对函数对象有任何的要求。2. 把bind()用在函数和函数指针上 有如下代码:[代码] 当调用boost::bind(f, 1, 2);的时候, 它会产生一个空的函数对象,这个对象没有参数, 返回 f(1,2).当然我们也可以给它加个参数: [代码] 结果: 作为和std::bindlst的对比我们可以
阅读全文
摘要:很久之前写的一篇关于C++智能指针的调研报告,这里贴出来。Auto_ptr本来就是给局部变量用的,目的很单一。主要就是为了解决异常一旦出现函数立即退出,这样的问题。auto_ptr不会降低程序的效率,理论上,合理使用容器加智能指针,C++可以完全避免内存泄露,效率只有微不足道的下降。最主要的特点:拥有权的转移。A:一个对象决不能被两个其指针“拥有”[代码]用着方便,和一般指...
阅读全文
摘要:最近在找工作,复习了下二叉树。 这里用C++重复制造了一个二叉树的轮子和大家分享下。 本文章是对代码的解释, 源码的贴出放在最后。在阅读本片代码的时候注意一下几点:# 用了泛型技术:templeate <class T># const 引用 (C++程序员装B必备)在阅读代码的时候可能会不太习惯。1. 二叉搜索树的结构 一个二叉树的如果不为空便是由一个根节点和左右两个只树构成。 二叉搜...
阅读全文
摘要:这篇文章用汇编查看c/c++中常见的控制流。1. if else 在汇编中主要用cmp指令比较两个数,然后利用jz/jnz实现逻辑的跳转。 首先我们看下cmp指令的功能CMP结果ZFCF目的<源01目的>源00目的=源10 对于有符号数,我们常用jnz表示不相等则跳,jle表示小于则跳,我们可以看下如下列子:代码很简单, 看上去是不言而喻的, 就不过多解释了。 有时我们会直接判断函数的...
阅读全文
摘要:STL 中的list是对链表的封装。本次剖析的对象是SGI STL。注:和原版的SGI STL 代码有出入,主要体现在:内存分配上, 变量的命名方式上,还有N多代码的省略上,所以本文章贴出的代码只适合参考一下。1. 链表的特点 - O(1)级的插入和删除。 - 其绝对位置未知,所以不能被索引化,不支持随机存储。 - 查找其中某一元素的时候效率低下。2. list支持的操作 在STL中,list是对...
阅读全文