- 博客(73)
- 资源 (2)
- 收藏
- 关注
原创 《C和指针》—— 第13章 函数指针的作用1:回调函数2(与模板结合,简化代码)
注意:此为原创文章,未经同意,请勿随意转载。目录1. 问题与思路2. 具体实现3. 结果截图1. 问题与思路Q:实现一个与类型无关的比较函数,且考虑模板,精简代码A:声明一个函数指针,函数指针中的形参类型得声明成void*,这样任何类型都可以传递进来,也就是说,传给函数指针的参数是指向某种类型数据的指针,这样,入参类型就不受限制啦;有2个细节需要注意:细节1:对于简单数据类型(如int\float\double\char\string等, 直接用模板搞定。对于复杂数据类型,如自定义类类型数据,
2022-02-13 14:22:37
731
原创 《C和指针》—— 第13章 函数指针的作用1——回调函数1
1. 问题与思路Q:实现一个与类型无关的比较函数A:声明一个函数指针,每种类型各自实现自己的比较函数,函数指针指向具体类型的比较函数,即可实现类似模板的功能;特别值得注意一点:函数指针中的形参类型得声明成void,这样任何类型都可以传递进来,也就是说,传给函数指针的参数是指向某种类型数据的指针,这样,入参类型就不受限制啦~*升级版:其实还可以考虑模板,减少重复代码,见博客:2. 具体实现#pragma once#include <iostream>#include <str
2022-02-13 14:02:51
524
原创 《大话设计模式》C++实现:02 策略模式(三)—— 策略模式
文章目录1、优缺点1.1、优点1.2、缺点1.3、优化2、代码2.1、结果2.2、代码2.2.1、Strategy.h2.2.2、Context.h1、优缺点1.1、优点相较于简单定义各算法,将各算法组织起来并进行了一定的封装,方便了不同算法之间的切换。笔者感受:使用类C操控类A继承体系A1,A2,A3中公有对外暴露接口。利用一个额外的类,(1)将strategy抽象策略基类,作为额外类的入参;(2)将strategy抽象策略基类作为额外类的成员变量,利用多态原理,接收外面传来的具体抽象策略。
2020-11-18 21:24:54
385
原创 《大话设计模式》C++实现:02 策略模式(四)——(策略模式+简单工厂)
文章目录1、好处2、代码2.1、结果2.2、代码2.2.1 Strategy.h2.2.2、StrategyFactory.h1、好处策略模式+简单工厂:可以完全将策略继承体系与用户端完全剥离开来,将策略继承体系完全封装起来,对用户完全不可见。抽象总结一下:(1)类C里面通过没什么信息含量的枚举入参,利用简单工厂生成类A继承体系中的各子类A1、A2、A3。同时,用基类A作为类C的成员变量,接一下刚生成的类A的子类。(2)类C对外统一暴露一个接口,该接口中,类C的成员变量类A调用继承体系公有对外暴露
2020-11-18 21:08:11
351
原创 《大话设计模式》C++实现:02 策略模式(一)商场促销实例-初始版本(switch_case)
文章目录1. 什么是策略模式?2. 策略模式的适用场景?2.1 优缺点2.1.1 好处2.1.2 当心2.2 何时使用?3. 怎样使用策略模式?3.1 方法3.2 UML类图演进3.2.1 version1 (本篇博文的demo)4. 实例4.1 结果(结论先行)4.2 具体实现5. 策略模式-相关链接1. 什么是策略模式?策略模式(strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。2. 策略模式的适用场景?2.1 优缺点2.
2020-11-18 20:36:51
727
原创 《大话设计模式》C++实现:24 职责链模式(二)请假加薪实例-改进
文章目录1. UML类图2. 实例2.1 结果(结论先行)2.2 具体实现2.2.1 Request.h2.2.2 IManager.h2.2.3 CommonManager.h2.2.4 Majordomo.h2.2.5 GeneralManager.h1. UML类图2. 实例2.1 结果(结论先行)main.cpp#include "IManager.h"#include "CommonManager.h"#include "Majordomo.h"#include "Genera
2020-10-05 23:01:37
397
原创 《大话设计模式》C++实现:24 职责链模式(三)抽象总结
文章目录1. UML类图抽象2. 实例2.1 结果(结论先行)2.2 具体实现2.2.1 IHandler.h2.2.2 ConcreteHandler1.h2.2.3 ConcreteHandler2.h2.2.4 ConcreteHandler3.h1. UML类图抽象2. 实例2.1 结果(结论先行)main.cpp#include "IHandler.h"#include "ConcreteHandler1.h"#include "ConcreteHandler2.h"#incl
2020-10-05 22:11:31
281
原创 《大话设计模式》C++实现:24 职责链模式(一)请假加薪实例-初始版本
文章目录1. 什么是职责链模式?2. 职责链模式的适用场景?2.1 优缺点2.2 何时使用?3. 怎样使用职责链模式?3.1 方法3.2 UML类图演进3.2.1 version1v1 存在的问题v1 重构方向4. 实例4.1 结果(结论先行)4.2 具体实现4.2.1 Request.h4.2.1 Manager.h1. 什么是职责链模式?职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免球球的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这
2020-10-04 20:42:00
257
原创 《大话设计模式》C++实现:23 命令模式(三)抽象总结
1. UML类图抽象2. 实例2.1 结果(结论先行)main.cpp#include "Receiver.h"#include "ICommand.h"#include "ConcreteCmd.h"#include "Invoker.h"void test(){ CReceiver* pRcv = new CReceiver(); ICommand* pCmd = new ConcreteCmd(pRcv); Invoker* pInvk = new Invoker();
2020-10-04 14:27:48
1800
3
原创 《大话设计模式》C++实现:23 命令模式(二)进阶版2
1、场景说明完善了 《大话设计模式》C++实现:23 命令模式(二)进阶版 中删除订单功能。2、代码2.1、结果main.cpp//松耦合方式2: 进阶版2#include "ICommand.h"#include "BakeMuttonCmd.h"#include "BakeChickenWingCmd.h"#include "Waiter.h"void test2(){ CBarbecuer* boy = new CBarbecuer(); ICommand* pBake
2020-10-04 12:06:14
426
原创 《大话设计模式》C++实现:23 命令模式(二)进阶版
文章目录1、场景说明2、代码2.1、结果2.2、代码1、场景说明相较基础版:《大话设计模式》C++实现:23 命令模式(一)基础版:增加了时间、加订单,删订单(只留了接口)、一次通知全部的菜单的功能。2、代码2.1、结果//松耦合方式2: 进阶版#include "ICommand.h"#include "BakeMuttonCmd.h"#include "BakeChickenWingCmd.h"#include "Waiter.h"void test2(){ CBarbe
2020-09-30 20:41:30
421
1
原创 《大话设计模式》C++实现:23 命令模式(一)基础版
1. 什么是命令模式?命令模式(Command):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。2. 命令模式的适用场景?2.1 优缺点优点:第一、能较容易地设计一个命令队列第二、在需要的情况下,可以较容易地将命令计入日志第三、允许接收请求的一方决定是否否决请求第四、可以容易地实现对请求的撤销和重做第五、由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。最关键优点:命令模式将请求一个操作的对象与指导怎
2020-09-29 23:31:27
563
原创 NotePad++按指定字符换行
步骤:1 原始文件->2 全选->3 Ctrl+F->4 Replace->5 Search Mode: Regular expression->6 Find what:,->7 Replace with:\r->8 Replace All
2020-09-28 21:09:36
10068
2
转载 Git – fatal: Unable to create ‘XXX/.git/index.lock’: File exists.的解决办法
方法:在.git同级目录,执行rm -f .git/index.lock (或者rm -f git/index.lock) 删除后可提交。成功!来源
2020-08-30 09:55:50
952
原创 《大话设计模式》C++实现:01 简单工厂模式(优化,使用宏注册工厂)
一、代码1、结果1.1 main.cpp#include "Operation.h"#include "OperationFactory.h"#include "OperationAdd.h"#include "OperationSub.h"#include "OperationMul.h"#include "OperationDiv.h"void test(){ double numA = 200, numB = 100; cout << "A = " <<
2020-08-21 23:52:50
720
原创 《大话设计模式》C++实现:01 简单工厂模式
文章目录1. 什么是简单工厂模式?2. 简单工厂模式的适用场景?2.1 优点2.2 缺点3. 怎样使用简单工厂模式?3.1 方法3.2 UML类图4. 实例4.1 结果(结论先行)4.2 具体实现4.2.1 操作符集成体系代码4.2.2 简单工厂的静态接口1. 什么是简单工厂模式?当出现批量化的产品时,使用单独的类创建每个产品,实现去实例化对象。2. 简单工厂模式的适用场景?2.1 优点1、降低了客户与具体实现的耦合(相较不使用简单工厂而言)。封装了细节,客户只需调用工厂接口,不必关心如何创建产
2020-08-21 22:42:32
608
原创 《大话设计模式》C++实现:08 工厂模式
先上代码,后续补充~~1. 什么是迭代器模式?2. 迭代器模式的适用场景?3. 怎样使用迭代器模式?4. 实例1. 结果(结论先行)#include <iostream>#include "AddFactory.h"#include "SubFactory.h"#include "MulFactory.h"#include "DivFactory.h"#include "Operation.h"using namespace std;void test0(){
2020-08-16 23:40:30
506
原创 EMD距离——使用实例
Rubner的C语言实现首先我们尝试使用Rubner桑公开的C语言代码(example1.c),编译依赖emd.c和emd.h。其中特征量类型feature_t在emd.h中定义如下:typedef struct { int X,Y,Z; } feature_t;具体实现代码见emd.c。对于上述例子的解答如下:# include <stdio.h># include <...
2020-07-22 22:37:09
521
原创 《大话设计模式》C++实现:20 迭代器模式
1、什么是迭代器模式?1、迭代器模式(Iterator),提供了一种顺序访问一个聚合对象中各个元素,而又不保留该对象的内部表示的方法。2、简单来说,迭代器模式,分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地党文集合内部的数据。3、类似于 foreach in ,它就是不需要知道集合对象是什么,就可以遍历所有对象的循环工具。2、迭代器模式的适用场景?1、当需要访问一个聚集对象,且,不管这些对象是什么,都需要遍历的时候,应该考虑迭代器模式。
2020-07-18 19:59:30
299
原创 《大话设计模式》C++实现:07 代理模式(二)
3、怎样使用代理模式?初级,boy找代理追girl:《大话设计模式》C++实现:07 代理模式(一)升级,公共接口,真实实体,代理4、实例1、ISubject.h#pragma onceclass ISubject{public: virtual void Request() = 0;};2、RealSubject.h#pragma once#include "ISubject.h"#include <iostream>using namespace std;
2020-07-17 20:49:25
190
原创 《大话设计模式》C++实现:07 代理模式(一)
1、什么是代理模式?简而言之:代理模式就是在访问对象时,引入一定程度的间接性,因为这种间接性,可以附加多种用途。GoF描述:代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。2、代理模式的适用场景?3、怎样使用代理模式?初级,boy找代理追girl4、实例1、IGiveGift.h 公共接口函数#pragma onceclass IGiveGift{public: virtual void giveDools() = 0; virtual void give
2020-07-15 22:46:27
221
原创 《大话设计模式》C++实现:14 观察者模式(一)
其他后续跟上,先埋个坑,改天填坑~~1、什么是观察者模式2、为何要是用观察者模式3、如何才能用好观察者模式?4、怎样使用观察者模式?4.1 观察者模式的演进双向耦合单向解耦(解耦 具体观察者与 通知者)双向解耦(解耦 具体观察者 与 具体通知者)5、实例...
2020-07-10 09:17:06
318
原创 《大话设计模式》C++实现:17 适配器模式
1、 适配器模式是什么?Adapter:将一个类接口为转化作为客户希望的另一个接口。使得原本而由于接口不兼容而不能一起工作的那些类可以一起工作。2、 为何要使用适配器模式?在软件开发中,系统的数据和行为都正确,但接口不符时,我们需要考虑适配器,目的:是控制范围之外的一个原有对象与某个接口匹配。主要应用在希望服用一些现存的类,但是接口又与复用环境要求不一致的情况。如:在早期对代码笃用一些功能等应用上很有实际价值。3、 如何使用适配器模式?简单的UML图:4、 怎样才能用好适配器模式?(1
2020-07-07 23:05:02
312
原创 《C++ Primer》学习记录(2)const关键字
以上整理了《C++ Primer》与《Effective C++》。有不当之处,还望讨教~~
2020-07-05 21:55:58
177
原创 《C++ Primer》学习记录(1) 使用指针遍历多维数组的三种方式
void test9(){ //使用指针遍历多维数组 constexpr int row = 3; constexpr int col = 4; int a[row][col] = { { 0,10,20,30 },{ 40,50,60,70 },{ 80,90,100,110 } }; cout << "==================================1st way" << endl; cout << "for (auto p = a;
2020-06-27 19:19:11
605
原创 CFileDialog、CStdioFile读取文件中的内容,每行按空格依次读入
CFileDialog、CStdioFile读取文件中的内容,每行按空格依次读入注:1、该文件为固定为3列的小数txt文件,且数字之间以空格隔开2、CFileDialog 与 CStdioFile 类:class CFileDialog : public CCommonDialog //afxdlgs.hclass CStdioFile : public CFile //afx.hCF...
2019-01-11 20:55:06
1076
1
原创 C++ ifstream、sstream按行读取txt文件中的内容,并按特定字符分割,不用strtok
C++ ifstream、sstream按行读取txt文件中的内容,并按特定字符分割,不用strtok一、预备知识:主要用到:1、getline(ifstream in, string line);将文件in中的数据按行读取到line中2、getline(stringstream ss,string tmp,const char ch);将输入字符串流ss中的字符,按ch分割开,依次...
2019-01-11 20:11:53
16877
2
原创 Unicode字符集、多字节字符集下:CString->const char*、CString->LPCSTR
Unicode字符集、多字节字符集下:CString-&gt;const char*、CString-&gt;LPCSTR1、CString-&gt;const char*(1)多字节字符集下:CString-&gt;LPCTSTR可以自动转化!(2)Unicode下:使用函数 “wsprintfA”// BmpName-&gt;cstr_BmpName;// CString BmpNa...
2019-01-11 17:35:43
741
原创 mwArray的get函数用法
mwArray的get函数用法1、应用:在matlab与C++混合编程中:使用get函数将mwArray类型的数组中的数据存入vector&lt;vector&lt;double&gt;&gt; v中:mwArray a(col, row, mxDOUBLE_CLASS, mxREAL);//列优先,先列后行: 构建一个 col列 X row行 的matlab矩阵a.Get(1, co...
2018-12-07 13:04:03
4824
4
原创 C++ 四种数据交换的函数
C++ 四种数据交换的函数//使用异或操作实现原位数据交换//只对整数有效!!//引用+异或 方法1void myswap(int &amp;amp;amp;a, int &amp;amp;amp;b){ a = a^b; b = a^b; a = a^b;}//原位数据交换 不借助第三个变量//只适用于简单同种单一类型的数据(如int\float\double\char)//引用+“+-”四则运算符 ...
2018-11-28 18:32:57
4316
原创 C++ 模板化的student类对象的直接插入排序, 运算符重载,模板,两种模板化的交换数据函数
C++ 模板化的student类对象的直接插入排序, &amp;amp;gt;、&amp;amp;lt;、&amp;amp;lt;&amp;amp;lt;运算符重载,模板,两种模板化的交换数据函数1、student类对象(1)基本成员变量和成员函数定义:class student{private: string name; double score; int *index;public: student() :index(NU
2018-11-28 17:49:51
621
原创 C++ 使用数组建立二叉树 层序数组(方法二)
C++ 使用数组建立二叉树 层序数组(方法二)另外一种方法:见 C++ 使用数组建立二叉树 层序数组(方法一)试验中,遍历二叉树的非递归方法 见我的另一篇博客:二叉树的非递归遍历——前序、中序、后序、层序、层序按行输出1、输入数组要求数组是按照层序输入的,当该结点为空时,用‘#’代替空的位置。2、核心代码//层序数组构建二叉树BinaryTreeNode *ConstructBina...
2018-11-27 13:14:38
3011
5
原创 二叉树的非递归遍历——前序、中序、后序、层序、层序按行输出
二叉树的非递归遍历——前序、中序、后序、层序、层序按行输出一、自己总结归纳的二叉树的非递归遍历——前序、中序、后序、层序、层序按行输出层序和前序的程序代码特别像,只有两点差别:1、只是层序用到queue,前序用的stack2、前序先push了右孩子,再push左孩子层序先push了左孩子,再push右孩子//层序遍历void LevelOrder(BinaryTreeNode *T...
2018-11-27 12:55:27
493
1
原创 C++使用数组构造链表
C++使用数组构造链表1、链表的定义struct Node{ int value; struct Node* next;};2、使用数组构造链表Node *createList_array(int *a, int n){ Node *root = new Node(); Node *pnode = root; for (int i = 0; i &lt; n - 1; +...
2018-11-02 18:41:05
6228
原创 函数指针的作用
函数指针的作用函数指针的作用有二:一是作为参数传递给另一个函数;二是转换表。1、函数指针作为参数传递给另一个函数回调函数:将一个函数指针作为参数传递给其它函数。后者将“回调”用户函数。实例:实现一个与类型无关的查找函数(单链表)思考:单链表的元素类型可能是字符串或者数组,数组和字符串无法作为参数传递给函数,但是指向他们的指针却可以。要求:需要查找函数作用于任何类型的值解决办法:把...
2018-11-02 18:30:58
14621
原创 指针运算拾遗 ||
指针运算拾遗 ||1、*++p;2、++*p;3、*p++;4、(*p)++;5、++*++p;6、++*p++;//////////////////////////////////////////////////////////////////////////////1、*++p; 相当于 *(++p);2、++*p; 相当于 ++(*p); 即 *p = *p + 1;...
2018-10-30 18:53:12
185
SVD算法_C++版本
2017-10-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人