- 博客(80)
- 收藏
- 关注
原创 c++11/14新特性---智能指针
结果一个对象会被析构了两次,在这个例子中使用同一个指针 this 构造了两个智能指针对象 sp1 和 sp2,这二者之间是没有任何关系的,因为 sp2 并不是通过 sp1 初始化得到的实例对象。智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。counter对象的目地就是用来申请一个块内存来存引用基数,s是share_ptr的引用计数,w是weak_ptr的引用计数,当w为0时,删除Counter对象。进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。
2024-10-22 10:12:54 853
原创 c++11/14新特性---函数语法
如果能够使用临时对象已经申请的资源,既能节省资源,还能节省资源申请和释放的时间,如果要执行这样的操作就需要使用右值引用了,右值引用具有移动语义,移动语义可以将资源(堆、系统对象等)通过浅拷贝从一个对象转移到另一个对象这样就能减少不必要的临时对象的创建、拷贝以及销毁,可以大幅提高 C++ 应用程序的性能。通过测试代码可以看出,在子类中初始化从基类继承的类成员,需要在子类中重新定义和基类一致的构造函数,这是非常繁琐的,C++11 中通过添加继承构造函数这个新特性完美的解决了这个问题,使得代码更加精简。
2024-10-22 10:12:31 990
原创 c++11/14新特性---关键字
google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。为了实现运行时检测,编译器创建额外的代码,然而这会妨碍程序优化。用关键字using作为别名的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式,是由它的数据类型和初始值共同决定的。选择并返回操作数的数据类型。在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。将返回参数包中元素的数量,结果是一个编译时常量,类型为。
2024-10-22 10:11:35 884
原创 ubuntu jsoncpp 1.9.5 编译使用
目录下载编译拷贝头文件和库文件测试代码下载jsoncpp 1.9.5 好像不支持scons编译了,使用cmake编译原始仓库: https://github.com/open-source-parsers/jsoncppgitee仓库:https://gitee.com/mirrors/jsoncpp/tree/master选择版本下载编译搞到linux上解压执行cmake CMakeLists.txt,发现了编译攻略:按照上面的操作:创建目录:注:这边cp的文件是重新解压缩的,
2022-04-29 17:56:20 1202 7
原创 MyTinySTL阅读笔记---概述
文章目录简介分配器c++中的new和deletenew operatoroperator newplacement new实际测试deleteSTL分配器一级配置器二级配置器一级二级配置器统一的接口内存池实现MyTinySTL分配器allocatorconstructdestroy内存池实现allocatedeallocatereallocate迭代器概述类型traits萃取指针行为反向迭代器 r...
2021-11-08 15:56:43 5570 1
原创 MyTinySTL阅读笔记---仿函数和配接器
仿函数所谓仿函数也就是函数对象, 以前是这样称呼它的, 只是一直沿用至今了。仿函数就是一种具有函数特质的对象.。可以将部分操作由用户自己来定义然后传入自定义的函数名就可以被调用。根据参数个数分类一元仿函数一元仿函数基类:template <class Arg, class Result>struct unary_function { typedef Arg argument_type; // 参数类型别名 typedef Result result_type; //
2021-10-29 17:02:57 505 2
原创 MyTinySTL阅读笔记---迭代器
迭代器概述迭代器提供一种方法使它能够依顺序访问聚合物(容器)所含的各个元素,而又无需暴露改聚合物的内部表述方式。迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针(对operator *和operator->进行重载)。设计算法时,如果可能,尽量针对某种特定迭代器提供一个明确定义,并针对更强化的某种迭代器提供另一种定义,这样能在不同情况下提供最大效率。class与typename的区别typename和class在作为参数类型时用法一样, 没有区别typename主要用
2021-10-28 17:49:20 1812 12
原创 MyTinySTL阅读笔记---分配器
分配器c++中的new和delete1、new operatornew operator就是new操作符,平时使用的new(如int *pt = new object(...);)主要完成两个工作:分配足够的内存以便容纳所需类型的对象(operator new)调用构造函数初始化内存中的对象(placement new)2、operator newnew操作符为分配内存所调用函数的名字是operator new,就是间接性的调用了 malloc函数。源码:void* __CRTDECL
2021-10-28 17:47:51 1469 2
原创 linux c语言线程池
文章目录线程池原理线程池原理我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的
2021-10-22 17:17:09 655
原创 c++11/14特性整理---汇总(线程)
auto 关键字for-each 循环右值及移动构造函数 + std::forward + std::move + stl 容器新增的 emplace_back() 方法std::thread 库、std::chrono 库智能指针系列(std::shared_ptr/std::unique_ptr/std::weak_ptr),智能指针的实现原理一定要知道,最好是自己实现过线程库 std::thread + 线程同步技术库 std::mutex/std::condition_variable/std::l
2021-07-29 10:21:05 1347
原创 win32 纸牌
实现效果具体实现牌分为三个部分,鼠标可以拿起若干牌,可以拖动,按照一定规则放置到其他位置,当所有的牌都放在上方时游戏就赢了。牌的随机排列使用random_shuffle乱序之后,把m_vtr当做索引就行了。CCardCtrl::CCardCtrl(): m_vtr(52){ 。。。 for (int i = 0; i < 52; i++) { m_vtr[i] = i; } srand((unsigned int)time(NULL)); random_shuffle(
2021-07-19 11:40:13 233
原创 Tinyhttpd源码阅读
文章目录简介tinyhttpd的职责http请求和响应报文格式请求响应运行代码代码执行流程源代码windows版简介tinyhttpd 是一个超轻量型 Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,用来学习非常不错,可以通过阅读这段代码理解一个 Http Server 的本质。tinyhttpd的职责接收客户端链接读取客户端发送的信息解析请求处理请求(可能会执行对应的脚本)返回响应http请求和响应报文格式参照菜鸟教程请求一
2021-03-03 18:23:43 545 1
原创 23种设计模式---概述
文章目录设计模式简介设计模式分类设计模式之间的关系面向对象设计原则为什么要用面向对象设计?例子重新认识面向对象设计原则开放封闭原则(OCP)Liskov替换原则(LSP)依赖倒置原则(DIP)单一职责原则(SRP)接口隔离原则(ISP)参考网站:菜鸟教程 C语言中文网设计模式简介设计模式设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
2021-02-02 17:20:46 912
原创 23种设计模式---解释器模式
解释器模式动机在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。解决方法给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。例子#include <iostream>#include <map>#include <stack&g
2021-02-02 17:19:15 165
原创 23种设计模式---访问者模式
访问者模式动机在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法) 。如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题?解决方法表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。例子#include <iostream>using na
2021-02-02 17:09:23 153
原创 23种设计模式---命令模式
命令模式动机在软件构建过程中,“行为请求者"与"行为实现者"通常呈现一种"紧耦合”。但在某些场合-比如需要对行为进行"记录、撤销/重(undo/redo)、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与“行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。解决方法将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。例子#include <iostream>#
2021-02-02 16:38:12 134
原创 23种设计模式---责任链模式
责任链模式动机在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。解决方法使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。例子#include <iostream>#include <strin
2021-02-02 16:30:26 114
原创 23种设计模式---迭代器模式
迭代器模式动机在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种"透明遍历"也为 ,"同一种算法在多种集合对象上进行操作"提供了可能。使用面向对象技术将这种遍历机制抽象为"迭代器对象"为"应变化中的集合对象"提供了一种优雅的方式。...
2021-02-02 16:20:45 125
原创 23种设计模式---组合模式
组合模式动机在软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。如何将"客户代码与复杂的对象容器结构"解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象样来处理复杂的对象容器?解决方法将对象组合成树形结构以表示"部分-整体"的层次结构。使得用户对单个对象和组合对象的使用具有一致性(稳定)。例子#include <iostream>#inc
2021-02-02 16:05:08 132
原创 23种设计模式---备忘录模式
备忘录模式动机在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。解决方法在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。例子class Memento{ string state; // ..publ
2021-02-02 15:52:48 106
原创 23种设计模式---状态模式
状态模式动力在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会对对象的操作和状态转化之间引入紧耦合?解决方法允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。例子enum NetworkState{ Network_Open, Network_Close, Network_Connect,};
2021-02-02 15:44:50 117
原创 23种设计模式---中介者模式
中介者模式动机在软件构建过程中,经常会出现多个对象互相关联交互的情况对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,我们可使用一个"中介对象"来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地氏御变化。解决方法用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖) ,从而使其耦合松散(管理变化) ,而且可以独立地交。例子// 抽象同事类c
2021-02-01 15:56:34 142
原创 23种设计模式---适配器模式
适配器模式动机在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象"放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种"迁移的变化" ?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?解决方法将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。例子// 目标接口(新接口)class ITarget{public: virtual void process()
2021-02-01 14:52:49 99
原创 23种设计模式---代理模式
代理模式动机在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等) ,直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复性?增加一层间接层是软件开发中常见的解决方式。解决方法为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。例子class ISubject{public: virtual void process();};class RealSubj
2021-02-01 14:40:31 118
原创 23种设计模式---外观模式
外观模式动机随着软件的开发,组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?解决方法为子系统中的一组接口提供一个一致(稳定)的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。例子用户需要了解所有类// 子系统角色class SubSystem01{public: void method
2021-02-01 14:26:39 126
原创 23种设计模式---桥接模式
桥接模式动机由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?解决方法将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。例子制作一个通讯工具:class Messager{public: virtual void Login(string username, string password) = 0;
2021-02-01 14:07:17 134
原创 23种设计模式---装饰模式
装饰模式动机在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?解决方法动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,装饰模式比生成子类(继承)更为灵活(消除重复代码 & 减
2021-01-31 14:37:52 104 1
原创 23种设计模式---观察者模式
观察者模式动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密, 将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。解决方法定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。例子文件分割器:简单实现:class M
2021-01-31 13:52:15 127
原创 23种设计模式---策略模式
策略模式动机在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂; 而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?解决方法定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。例子计算财务报表(支持跨国税率):一种实现:enum TaxBase{ CN_Tax,
2021-01-31 13:25:38 127
原创 23种设计模式---模板模式
模板模式动机在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如说框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作的前提下,来灵活应对各个子步骤的变化或者晚期的需求?解决方法定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟 (变化)到子类中。模板模式使得子类可以不改变 (复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。例子数据库开发人员定义了几个步骤:// 程序库开发
2021-01-31 13:07:02 115
原创 23种设计模式---建造者模式
建造者模式动机在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?解决方法将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。例子创建房子:class House{ //
2021-01-31 11:49:34 122
原创 23种设计模式---原型模式
原型模式动机在软件系统中,经常面临着“某些结构复杂的对象”创建工作;由于需求的变化, 需要创建的对象的具体类型经常变化,但是它们却有比较稳定一致的接口。如何应对这种变化?如何向客户程序(使用这些对象的程序)“隔离出”这些易变对象,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?解决方法实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要
2021-01-30 17:38:05 94
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人