C++语法
文章平均质量分 82
A鱼翔浅底A
每天进步一点点...
QQ:1106533113
展开
-
C++ 设计模式-策略模式
策略模式的介绍和使用原创 2022-12-06 20:16:35 · 2000 阅读 · 1 评论 -
C++ 设计模式-观察者模式
设计模式介绍一、观察者模式1. 观察者模式定义**2. 观察者模式本质**3. 观察者模式结构和说明(1) 结构(2) 调用顺序4. 观察者模式适用情况5. 观察者模式优缺点(1) 优点(2) 缺点6. 相关模式二、观察者模式示例代码...原创 2021-10-14 18:47:45 · 707 阅读 · 0 评论 -
C++ 设计模式-抽象工厂
设计模式介绍一、抽象工厂1. 抽象工厂定义**2. 抽象工厂本质**3. 抽象工厂结构和说明(1) 结构(2) 调用顺序4. 抽象工厂适用情况5. 抽象工厂优缺点(1) 优点(2) 缺点6. 相关模式二、抽象工厂示例代码...原创 2021-09-30 16:04:37 · 296 阅读 · 0 评论 -
C++ 设计模式-工厂方法
设计模式介绍一、工厂方法**1. 工厂方法定义**2. 工厂方法本质**3. 工厂方法结构和说明(1) 结构(2) 调用顺序4. 工厂方法适用情况5. 工厂方法优缺点(1) 优点(2) 缺点6. 相关模式二、工厂方法示例代码...原创 2021-09-30 16:03:13 · 987 阅读 · 0 评论 -
C++ 设计模式-简单工厂
设计模式介绍一、简单工厂简单工厂不是23中标准设计模式之一,但是太常用了,这里就介绍下1. 简单工厂定义略2. 简单工厂本质略3. 简单工厂结构和说明(1) 结构原创 2021-09-30 12:18:36 · 327 阅读 · 0 评论 -
C++ 设计模式-单例模式
一、单例模式介绍1. 单例模式定义保证一个类仅有一个实例,并提供一个访问它的全局访问点。2. 单例模式的本质控制实例的数目3. 单例模式的结构和说明(1) 结构Singleton:负责创建 Singleton类自己的唯一实例,并提供一个 getinstance I的方法,让外部来访问这个类的唯一实例。(2) 调用顺序懒汉式饿汉式二、单例模式优缺点1. 时间和空间懒汉式典型的时间换空间, 饿汉式典型的空间换时间懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需原创 2021-09-29 20:25:48 · 286 阅读 · 0 评论 -
模板-可变参数模板展开
模板-可变参数模板展开一、可变参数模板C++11增强了模板功能,在C++11之前,类模板和函数模板只能含有固定数量的模板参数,现在C++11中的新特性可变参数模板允许模板定义中包含0到任意个模板参数。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”。省略号的作用有两个:声明一个参数包,这个参数包中可以包含0...原创 2020-03-27 16:26:00 · 2668 阅读 · 0 评论 -
C++ 公共组件-对象消息总线库
C++ 公共组件-对象消息总线库消息总线介绍对象之间的关系一般有:依赖、关联、聚合、组合和继承,耦合关系也是依次加强的。对象间比较常见的关联关系是依赖、引用和继承。在大规模的软件开发过程中,对象很多,关联关系也非常复杂,如果没有一种统一、简洁的方法去管理这些对象的关系,很可能会导致对象的关系像蜘蛛网一样,导致后面维护的困难。对象间直接依赖或引用会导致依赖、引用关系复杂化;接口依赖是一种强耦合关...原创 2020-03-26 20:51:21 · 941 阅读 · 0 评论 -
C++ 公共组件-IOC库
C++ 公共组件-IOC库参考网址:https://blog.csdn.net/alpha_love/article/details/75208889IOC机制简介IOC机制可以让对象之间的关系在外面组装,外界可以根据需求灵活地配置这种机制的对象创建策略,从而获得想要的目标对象,这种机制被称为控制反转(Inversion of Control,IoC)。控制反转就是应用本身不负责依赖对象的...原创 2020-03-24 11:18:57 · 1161 阅读 · 0 评论 -
C++ 公共组件-轻量级AOP库
C++ 公共组件-轻量级AOP库1.AOP介绍AOP(Aspect-Oriented Programming,面向方面编程),可以解决面向对象编程中的一些问题,是OOP的一种有益补充。面向对象编程中的继承是一种从上而下的关系,不适合定义从左到右的横向关系,如果继承体系中的很多无关联的对象都有一些公共行为,这些公共行为可能分散在不同的组件、不同的对象之中,通过继承方式提取这些公共行为就不太合适了...原创 2020-03-11 19:38:20 · 1773 阅读 · 0 评论 -
C++ 公共组件-线程池实现
C++ 公共组件-线程池实现线程池模型介绍在处理大量并发任务的时候,如果按照传统的方式,一个请求一个线程来处理请求任务,大量的线程创建和销毁将消耗过多的系统资源,还增加了线程上下文切换的开销,而通过线程池技术就可以很好地解决这些问题。线程池技术通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在处理完任务之后还可以重用,不会销毁,而是等待下次任...原创 2020-03-11 11:05:00 · 347 阅读 · 0 评论 -
C++ 公共组件-placement new 实现内存池
C++ 公共组件-placement new 实现内存池内存池必要性有些时候我们需要能够长时间运行的程序(例如监听程序,服务器程序)对于这些7*24运行的程序,我们不应该使用标准库提供的new 和 delete (malloc和free也算)。这是因为随着程序的运行,内存不断的被申请和被释放,频繁的申请和释放将会引发内存碎片、内存不足等问题,影响程序的正常运行。更多的时候核心程序不允许内存申请...原创 2020-03-09 16:03:05 · 533 阅读 · 0 评论 -
C++ 公共组件-对象池实现
C++ 公共组件-对象池实现对象池基于C++11 简单实现对象池#include<string>#include<functional>#include<memory>#include<unordered_map>#include <iostream>using namespace std;const int MaxO...原创 2020-03-06 23:25:00 · 394 阅读 · 0 评论 -
C++ 设计模式-命令模式
C++ 设计模式-命令模式参考网址:https://blog.csdn.net/u012611878/article/details/77726460命令模式在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象...原创 2020-03-06 16:01:57 · 295 阅读 · 0 评论 -
C++ 设计模式-访问者模式
C++ 设计模式-访问者模式参考网址:https://www.cnblogs.com/suzhou/p/designpattern17visitor.html意图表示一个作用于某对象结构的各元素的操作。它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作适用性在下列情况下使用Visitor模式:一个对象结构包含很多类对象需要对其中的对象进行很多不同的并且不相关的操作对象很...原创 2020-03-05 16:02:07 · 1037 阅读 · 0 评论 -
C++ 设计模式-观察者模式
C++ 设计模式-观察者模式参考网址:https://blog.csdn.net/wuzhekai1985/article/details/6674984观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。基于C++继承方式实现#...原创 2020-03-04 17:49:30 · 190 阅读 · 0 评论 -
STL部分排序
一、我们先总结一下排序选择:● 如果你需要在vector、string、deque或数组上进行完全排序,你可以使用sort或stable_sort。● 如果你有一个vector、string、deque或数组,你只需要排序前n个元素,应该用partial_sort。● 如果你有一个vector、string、deque或数组,你需要鉴别出第n原创 2016-12-13 18:34:30 · 563 阅读 · 0 评论 -
C++ 信号槽实现
一、事件源类: 23 class CDataTrans- 24 { | 25 public:| 26 CDataTrans();| 27 ~CDataTrans();| 28 bool Open(const unsigned int nDsnSvr, const int nPort, const int n原创 2017-08-07 14:00:51 · 574 阅读 · 0 评论 -
std::tr1::bind 或 std::tr1::function使用
参考博客网址:http://blog.csdn.net/kiang3/article/details/7571647一、常规OO设计:写一个Thread base class,含有(纯)虚函数 Thread#run(),然后应用程序派生一个继承class,覆写run()。程序里的每一种线程对应一个Thread的派生类。例如Java的Thread可以这么用。缺点:如果一个clas原创 2017-08-07 14:06:42 · 394 阅读 · 0 评论 -
通过重载避免隐式类型转换
以下是一段代码,如果没有什么不寻常的原因,实在看不出什么东西: class UPInt { // unlimited precision public: // integers 类 UPInt(); UPInt(int value);原创 2016-11-17 11:49:05 · 347 阅读 · 0 评论 -
需要无格式一个一个字符输入时考虑使用istreambuf_iterator
先让我来吹嘘一下:这种技术2行代码就可以读到文件所有内容哦第一种方式:#include #include ifstream inputFile("interestingData.txt");// 把inputFile读入fileDatastring fileData( ( istream_iterator(inputFile) ), istream_ite原创 2016-12-13 17:00:48 · 1692 阅读 · 0 评论 -
C++禁止类被继承
#include "stdafx.h"#include using namespace std;template class CFinalClass{friend T;private:CFinalClass(){}~CFinalClass(){}};class CXX{public:CXX(){ cout ~CXX转载 2016-11-21 18:44:38 · 453 阅读 · 0 评论 -
限制某个类能产生的对象数量
众所周知:只能生成一个对象的是单例模式,但是看一下情况:假设定义一个Printer 类:建立 Printer 对象 p1; 使用 p1; 释放 p1; 建立Printer对象p2; 使用 p2; 释放 p2; ... 这种设计在同一时间里没有实例化多个Printer对象, 而是在程序的不同部分使用了不同的Printer对象。不允许这样编写有些原创 2016-11-18 10:16:19 · 683 阅读 · 0 评论 -
判断对象是否在堆中分配
看下面的一个基类:class HeapTracked { // 混合类; 跟踪 public: // 从operator new返回的ptr class MissingAddress{}; // 异常类,见下面代码 virtual ~H原创 2016-11-18 11:16:26 · 609 阅读 · 0 评论 -
禁止堆对象
例如,如果你想不想让用户在堆中建立UPNumber对象,你可以这样编写: class UPNumber { private: static void *operator new(size_t size); static void operator delete(void *ptr); ... }; 现在用户仅仅可以做允许它们做的事原创 2016-11-18 11:34:16 · 310 阅读 · 0 评论 -
将构造函数和非成员函数虚拟化
虚拟构造函数:从字面来看,谈论“虚拟构造函数”没有意义。当你有一个指针或引用,但是不知道其指向对象的真实类型是什么时,你可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当你还没拥有一个对象但是你又确切地知道想要的对象的类型时,你才会调用构造函数。那么虚拟构造函数又从何谈起呢?例如,假设你编写一个程序,用来进行新闻报道的工作,每一条新闻报道都由文字原创 2016-11-17 19:35:10 · 331 阅读 · 0 评论 -
协助完成返回值的优化
一个返回对象的函数很难有较高的效率, 因为传值返回会导致调用对象内的构造和析构函数,这种调用是不能避免的。问题很简单:一个函数要么为了保证正确的行为而返回对象要么就不这么做。如果它返回了对象,就没有办法摆脱被返回的对象。就说到这。 考虑rational(有理数)类的成员函数operator*: class Rational { public: Rational(in原创 2016-11-17 11:15:41 · 257 阅读 · 0 评论 -
理解临时对象的来源
在C++中真正的临时对象是看不见的,它们不出现在你的源代码中。建立一个没有命名的非堆(non-heap)对象会产生临时对象。这种未命名的对象通常在两种条件下产生:为了使函数成功调用而进行隐式类型转换和函数返回对象时。 理解如何和为什么建立这些临时对象是很重要的,因为构造和释放它们的开销对于程序的性能来说有着不可忽视的影响。 首先考虑为使函数成功调用而建立原创 2016-11-17 10:49:38 · 438 阅读 · 0 评论 -
使用析够函数时防止资源泄漏
对指针说再见。必须得承认:你永远都不会喜欢使用指针。 Ok,你不用对所有的指针说再见,但是你需要对用来操纵局部资源(local resources)的指针说再见。假设,你正在为一个小动物收容所编写软件,小动物收容所是一个帮助小狗小猫寻找主人的组织。 每天收容所建立一个文件, 包含当天它所管理的收容动物的资料信息,你的工作是写一个程序读出这些文件然后对每个收容动物进行适当的处理(a原创 2016-11-16 20:17:17 · 278 阅读 · 0 评论 -
在构造函数中防止资源泄漏
如果你正在开发一个具有多媒体功能的通讯录程序。 这个通讯录除了能存储通常的文字信息如姓名、地址、电话号码外,还能存储照片和声音(可以给出他们名字的正确发音) 。为了实现这个通信录,你可以这样设计: class Image { // 用于图像数据 public: Image(const string& imageDat原创 2016-11-16 20:29:06 · 311 阅读 · 0 评论 -
smart pointer(灵巧指针)和继承类到基类的类型转换
假设我们有一个public继承层次结构,以模型化音乐商店的商品:class MusicProduct { public: MusicProduct(const string& title); virtual void play() const = 0; virtual void displayTitle() const = 0; ... }; c原创 2016-11-18 14:40:44 · 528 阅读 · 0 评论 -
>> << 0xf 等用法
一、>>这是C语言中的“右移运算符”。一般情况下,他是按位操作。特点:1.双目运算符,就像+、-、*、/一样,格式为(数1)>>(数2) 2.数1是被操作数,如被减数、被除数等;数2是右移位数。 3.优先级低,结合性:从左向右运算如:8>>1=?表示将被移数向右移动1位如何操作?1.化十进制数为(注意了)对应的二进制数,对应指格式对应2.通通右移,正数左补原创 2016-12-02 14:25:19 · 9446 阅读 · 0 评论 -
二重调度(三):只使用虚函数
其实有一个方法可以将用RTTI实现二重调度固有风险降到最低的,不过在此之前让我们看一下怎么只用虚函数来解决二重调度问题。 这个方法和RTTI方法有这同样的基本构架。collide函数被申明为虚,并被所有派生类重定义,此外,它还被每个类重载,每个重载处理一个派生类型: class SpaceShip; // forward decla原创 2016-11-21 17:04:13 · 288 阅读 · 0 评论 -
二重调度(七):再谈 初始化模拟虚函数表
这就是关于二重调度的所有要说的,但是,用如此悲观的条款来结束是令人很不愉快的。因此,让我们用概述初始化collisionMap的两种方法来结束。 按目前情况来看,我们的设计完全是静态的。每次我们注册一个碰撞处理函数,我们就不得不永远留着它。如果我们想在游戏运行过程中增加、删除或修改碰撞处理函数,将怎么样?不提供。 但是是可以做到的。我们可以将映射表放入一个类原创 2016-11-21 17:59:10 · 201 阅读 · 0 评论 -
二重调度(六):继承与模拟虚函数表
我们还有一个问题需要处理。 (如果,此时你奇怪老有最后一个问题要处理,你将认识到设计一个虚函数体系的难度。 )我们所做的一切将工作得很好,只要我们不需要在调用碰撞处理函数时进行向基类映射的类型转换。 假设我们开发的这个游戏某些时刻必须区分贸易飞船和军事飞船,我们将对继承体系作如下修改,根据 Item M33的原则,将实体类CommercialShip和MilitaryShip从抽象类Space原创 2016-11-21 17:54:38 · 169 阅读 · 0 评论 -
二重调度(五):使用非成员的碰撞处理函数实现
我们现在知道了怎么构造一个类似vtbl的映射表以实现二重调度的第二部分,并且我们也知道了怎么将映射表的实现细节封装在lookup函数中。因为这张表包含的是指向成员函数的指针,所以在增加新的GameObject类型时仍然需要修改类的定义,这还是意味着所有人都必须重新编译, 即使他们根本不关心这个新的类型。 例如, 如果增加了一个Satellite类型, 我们不得不在SpaceShip类中增加原创 2016-11-21 17:42:27 · 309 阅读 · 0 评论 -
二重调度(四):模拟虚函数表实现
有一个方法来增加选择。编译器通常创建一个函数指针数组(vtbl)来实现虚函数,并在虚函数被调用时在这个数组中进行下标索引。使用vtbl,编译器避免了使用if...then...else链,并能在所有调用虚函数的地方生成同样的代码:确定正确的vtbl下标,然后调用vtbl这个位置上存储的指针所指向的函数。 没理由说你不能这么做。如果这么做了,不但使得你基于RTTI的代码更具效率(下标索引加函数指针的原创 2016-11-21 17:21:33 · 280 阅读 · 0 评论 -
引用计数的使用
在现存类上增加引用计数我们如何让一个位于支撑库中而无法修改的类获得引用计数的好处呢?我们现在可以应用这句格言:计算机科学中的绝大部分问题都可以通过增加一个中间层次来解决。RCWidget是给用户使用的类,RCOBject是操作引用计数的,CountHoler是一个中间层,Widget是需要添加引用计数的类RCObjcet可以被构造(作为派生类的基类部分)和析原创 2016-11-18 20:23:10 · 341 阅读 · 0 评论 -
使用代理类区分operator[]进行的是读操作还是写操作 — 懒惰计算思想的运用
扮演其它对象的对象通常被称为代理类在代理类的各种用法中,最神奇的是帮助区分通过operator[]进行的是读操作还是写操作我们想区分将operator[]用作左值还是右值,因为,对于有引用计数的数据结构,读操作的代价可以远小于写操作的代价。前面所讲的引用计数的使用,引用计数对象的写操作将导致整个数据结构的拷贝,而读不需要,只要简单地返回一个值。不幸的是,在operator[原创 2016-11-21 11:31:05 · 583 阅读 · 0 评论 -
二重调度(一):什么是二重调度?
有时,借用一下Jacqueline Susann的话:一次是不够的。例如你有着一个光辉形象、崇高声望、丰厚薪水的程序员工作,在Redmond,Wshington的一个著名软件公司--当然,我说的就是任天堂。为了得到经理的注意,你可能决定编写一个video game。游戏的背景是发生在太空,有宇宙飞船、太空站和小行星。 在你构造的世界中的宇宙飞船、太空站和小行星,它们可能会互相碰撞。假设其规原创 2016-11-21 16:53:33 · 1463 阅读 · 0 评论