- 博客(53)
- 资源 (15)
- 收藏
- 关注
原创 插件Undo/Redo两种方式封装使用
在做插件开发时,插件本身的操作要和框架进行交互,一般由插件自身去记录修改的内容,让后将每一次的操作标识指针交给框架,在适当的时候进行触发处理。下面给出大致的伪代码和原理。一.将单个操作和一组操作一并进行注册下面给出基本的演示代码如下:enum struct UndoItemType{ kUndoItemTypeSigle, kUndoItemTypeMutil};class IUndoItem {public: virtual ~IUndoItem() {}
2021-09-15 18:49:28
311
原创 关于inline的使用记录
使用记录:在一个全局的头文件中对一个函数进行了实现,然后在其他多个.cpp中去使用这个类,那么编译会存在已经存在实现在.obj中,这时考虑使用inline关键字。(注意:inline函数本身是有汇编代码地址的,但是被其它cpp编译后是找不到该函数名地址的,相当于函数表中是没有的)源文件中没有使用inline关键字修饰的函数,inline函数代码块是没有的,inline函数函数地址是没有的;而对于一般的函数,尽管是函数没有被调用,也可以看到函数地址; 下面给出简单的使用例子:typedef i
2021-08-10 00:00:49
177
原创 文档坐标、设备坐标、视图坐标的关系
大家在开发过程中一定会遇到各种坐标,有的时候给人云里雾里、琢磨不透的感觉,现在希望能就我我开发过程的经历,给大家进行一番浅薄的讲解。拿我们常用的PDF版式文档来说,每一个页面Page都有固有的大小,然后按照每页从上到下顺序组织,并且是上面的坐标值大,这样在一个初始的定义规定好大小后,里面就可以放各种的元素,以此达到夸平台的目的。为了设配各个不同厂家的显卡、打印机等设备,这时就有了设备坐标,不同的设备的大小尺寸、起始方向是不一样的,因此要进行一个转换,也是为了快速计算等需求,有时是要做优化的。到最后,就是设备
2021-07-05 20:41:16
212
1
原创 树节点逻辑关系记录及节点查找功能(二)
对前面的文章:数据结构树节点深度和广度关系递归记录进行了延伸,下面给出演示代码: typedef struct NODEINFO { NODEINFO() { pParent = nullptr; pBefore = nullptr; pAfter = nullptr; pChild = nullptr; } NODEINFO(FPD_Ob
2021-07-04 22:13:43
172
原创 Provider提供者模式与策略模式的比较
在这篇文章Provider和Factory的区别,作者提到“可以往工厂里面添加Provider。也就是说Factory里面可能存在着许许多多的Provider。而这些Provider将是最后Factory创建出结果的必要支撑”。可以理解为提供者是一种大的模式,而工厂模式是其中的一种;再拿我们熟知的策略模式,根据传入的参数不同,可以得到不同的功能。也可以理解为Provider的一种,在这个例子浅谈提供者模式(provider pattern),中看到:namespace Porvider{
2021-06-27 01:41:06
1106
原创 c++智能指针自定义删除器和封装成C接口举例
在开发过程中,我们可能会经常使用第三方的库和接口来不断地New对象,这时我们要考虑,使用智能指针来管理我们的对象,不然函数中有大量的Return,就需要我们去释放分配的对象,维护起来也比较manfan...
2021-06-13 04:23:47
690
2
原创 数据结构树节点深度和广度关系递归记录
在树结构中,一般有GetChild和GetNextSibing的函数提供给我们使用,通过这两个接口和递归能够遍历得到树的所有的节点的信息。而在某些开发情况下,
2021-06-10 16:25:51
161
原创 GTest的简单实用
开发过程中的SDK接口,做单元测试,可以选用GTest,下面给出了简单的演示代码:class ArticleTest : public ::testing::Test {protected: // You can remove any or all of the following functions if their bodies would // be empty. ArticleTest() { // You can do set-up work for each test her
2021-06-09 18:29:13
242
1
原创 C++对象内容比较和指针比较
使用容器存储的时候,一定要注意里面存储的是对象和还是对象的指针,这两者是有区别的。如果是对象的对话,在进行一个删除、查找Find的时候,会调用类的比较==运算符,而如果是指针的话,则会判断sh...
2021-06-03 15:28:13
437
原创 c++禁止子类拷贝构造和赋值操作
在日常开发某些场景下,不允许一些类对象的拷贝构造和赋值操作,这时可以考虑将这些类从一个对拷贝和赋值做限定的父类继承即可,给出简略的演示代码:class CUncopyable{protected: CUncopyable() {} ~CUncopyable() {}public: CUncopyable(const CUncopyable&) {} CUncopyable& operator=(const CUncopyable&)
2021-06-01 15:08:32
554
原创 软件编程设计和解决问题一种思想:用时处理
作为开发人员,想必大家平时在开发工程中一定会遇到这种场景:在某一时间点不需要获取所有的数据来展现给用户观看,而采取一种使用时再加载或者刷新的机制,我们称之为用时处理技术,相信大家也普遍地使用,并进行了优化;比如大型工程的动态库、插件,网络上的缓冲视频流、线性化的PDF显示、数据库中的部分类容、一个大TreeCtrl中的节点等等,以上事例程序在启动的时候不需要加载所有的功能、或者是界面不需要做全部的显示、或者是浏览文件/视频的时候不需要全部的下载完诸如此类,我们都会采用用时处理的技术;讨论的再详细些,比如
2021-05-19 19:17:56
104
原创 Gerrit审查工具
Gerrit是Google公司在Android开源项目中GIT应用上的两个重要创新之一,基于Web的代码评审和项目管理的工具,它是为Git引入的代码审核服务器,其代码审核是强制性的,就是说,向Git版本库的推送必须要经过Gerrit服务器,修订代码必须经过代码审核的工作流程之后,经批准才能合并到正式版本库中。一、基本原理1、基于SSH的GIT服务器Gerrit是基于SSH协议实现的GIT服务器,其端口不是标准的22,而是29418端口。2、特殊引用Gerrit的GIT服务器,禁止用户..
2021-05-18 18:22:09
594
原创 基于PluginSDK的模块下沉和回调函数封装设计
一、Plugin SDK模块下沉的两种设计在大型项目中,框架通常是支持插件加载和插件开发的,这样有助于提升程序的效率和完成更多的第三方的开发需求;因此,在实际场景中,也经常会出现对已有的模块进行下沉,下面给出了两种常用的设计:1)已有Module基于Core层的封装这样情况是工程中的Module都基于Core lib 进行封装,封装成PluginSDK 所支持的形式;数据层Module中用的参数,返回值都是Core层所提供的;2)已有Module基于现有PluginSDK层的封装
2021-05-17 23:58:08
305
1
原创 VS2107中库或者插件的配置
这里做一个简单的记录,将我们的主程序编译成Debug的模式。在我们的每一个VS工程中会存在一个.user的配置文件这里记录着工程的设置;现在假设我们需要调试一个插件的话,打开工程的属性设置:注意一定要配置正确;这时在本地文件设置中会出现如下增加内容:自己添加的配置都放在了这里;...
2021-05-12 10:33:02
106
原创 编程之美(二):Lamda匿名回调函数配合模板来实现代码最大复用
在我们平时项目中,一定会出现这种情况:大量的操作开始和结束的处理是一致的,比如一些打开显示、关闭消除的操作(如我们在编辑修改一个文件),而在中间要传入不同的实现体,还比如一些对资源的访问请求、结束时的关闭断开等;还比如对一个界面控件的处理,其它的诸如任务栏、状态栏、进度条、Undo/Redo处理的逻辑大致都是一样的,现在不可能分别的写出每一个操作的函数那么就要考虑采用一种模板封装的方法如下:#pragma once#include <iostream>name...
2021-04-26 10:48:03
119
原创 链表的基本操作封装
下面为单链表的基本操作:#include <iostream>using namespace std;struct NODE{ int data; NODE*pNext; NODE(int value) { data=value; pNext=NULL; }};class List{public: List() { m_head=NULL; count=0; } ~List(); void insert(NODE*
2021-02-27 17:23:11
198
原创 PDF文档数据结构记录
一、MetaData数据后面会紧跟两个相邻Index的额外信息说明对象,尽管他们没有出现在间接对象中,但是通过MetaData能获取到。 这样按照自己内部定义的方式进行解析读取,能够更快速的获得相应内容,达到快速加载的目的,而别的厂家可能不会读取到这个。如上面中的 /Names 记录了文档中的Destination。...
2021-01-29 18:18:21
355
原创 编程之美:回调函数的两种传递记录方式差异及使用场景分析
一、前言 回调函数能够以高效的事件响应速度和灵活的模块解耦能力实现功能,而深受大家的钟爱。合理而又正确的使用将会为我们的程序增加加彩。废话不多说,下面就笔者经常遇到和使用的两种场景进行阐述,以此来给大家打来一些帮助和启发。...
2021-01-18 20:30:44
113
原创 架构深造:一种抽象文档解析、显示、编辑修改MVC模式及跨平台工具设计总结
目录一背景说明大家平时在学习工作过程中,一定会遇到各式各样的抽象编辑文档,如办公的Excel,word,ppt,或者保持同一显示效果的PDF文档,亦或是工业绘图的cad、电路绘图Altium Designer等等林林种种。这里做一个小小的剖析,希望能给大家的软件设计或者是编程思想起到一定的帮助与提升。二流程简介三总结...
2020-12-31 14:21:39
159
1
原创 Git同步更新但本地和期望结果仍存在差异的情况
git lfs checkout 可以更新大文件的内容,我们在使用SourceTree在CheckOut切换分支或者是当前版本的时候, 偶尔发现一些托管的大文件总是不存在或者存在差异这样的问题,即使我们使用git reset 从本地亦或是git pull从远程的仓库进行更新发现本地版本都没有改动并且和最新的保持一致,但是却提示找不到相应的文件,但是本地文件和别人不一样,这个时候就要考虑,git lfs的原因了,要使用git lfs checkout 来进行一次更新,git 和git lfs 都托管了一...
2020-12-06 20:07:57
424
原创 Qt Pri文件使用之预编译头文件设置和编译检查安全选项制定
一:概述1.1预编译头文件 在开发过程中,制定设置好预编译头文件,不仅会使得引用索引头文件脉络逻辑清晰,一目了然,并且可以减少我们的#include ,减少不必要的书写,从而提高效率。1.2编译检查安全选项利用编译器的编译检查选项,可以做在编译器做出很多的警告检查。正确的使用编译检查功能,有助于提升代码的规范性,可以减少不必要的判断处理、危险操作,有助于代码的维护和程序运行的稳健型。二:演示下面给出例子来对上面两点进行一个简单的说明:priConfigure.prico..
2020-12-06 17:44:41
862
原创 c++私有继承探索与分析
引言私有继承在实际使用过程中不多,主要是因为使用共有继承能够很好的支持对象的原有特性,即在对象外部的系列访问和操作。在某些场合,我们只希望访问父类的方法并对访问做了限制,就可能会使用到私用继承(或者保护继承)。举例通过下面的程序代码来简单的演示私有继承的使用:#include <iostream>class RichMan{public: RichMan() {}; ~RichMan() { std::cout << "RichMan Deconstru
2020-11-08 21:40:36
110
原创 编程进阶一:编译器的特殊功能使用及借助编译时完成数据的初始化
一、背景介绍 在我们平常开发模块过程中,尤其是大型工程,会有很多数据、函数类型的申明及初始化,在这个时期(编译期)利用好编译器所支持的语法功能,会给我们的开发带来极大的方便。应将编译器理解成一种帮助我们智能分析、生成、统计的工具和朋友,很多事情可以交给他去完成,而不是手动的去做。作为优秀的编程技术人员,是必须要熟练掌握和正确使用的,并且尽可能了解钻研它所支持的功能!二、使用场景下面将给出几个范例:...
2020-10-27 19:11:59
215
原创 一、代码赏析:使用模板类来创建一个回调管理模块
1.工程中合适使用模板,益处颇多,不管是软件自身版本升级亦或是系统升级还是跨平台,都可见一斑。废话不多说,直接贴代码:#ifndef _INTERNAL_SDK_EVENT_MGR_H_#define _INTERNAL_SDK_EVENT_MGR_H_#include <map>#include <memory>#include <type_traits>#include <vector>namespace handle {templat
2020-10-13 19:15:28
122
原创 关于QPushButton setDefault不能正常显示的问题记录
一、简述笔者在做办公软件的一个文件服务下载/阅读/修改/上传功能开发,是基于框架的一个插件,然后与OneDrive服务器交互,涉及到Ui界面。界面上有登录账号、文件列表等内容,通信、文件记录、等已开发完毕,在提交测试上传版本的时候,却发现界面上的Open/Save SetDefault不能始终正常系统默认的高亮效果:该PushButton失去焦点后,无任何效果。二、探索针对这种情况,然后就通过建立一些简单的工程来分析测试.从最初的提交测试,到后面的预发布版本,始终没有找到原因。在..
2020-09-30 18:29:17
563
原创 QTableWiget设置自定义排序
一.介绍 很多引用场景中,我们需要使用到QTableWidget来显示内容,如资源管理器中显示的系统信息。使用过程中,对里面的Item进行排序,将显得更加条理可观。二.使用下面为一种简单的实现方法:class FileListTableWidgetItem : public QTableWidgetItem{public: explicit FileListTableWidgetItem(); explicit FileListTableWidgetItem(..
2020-09-21 19:09:54
958
原创 关于Fiddler使用过程中突然不能抓包的问题
关于Fiddler使用过程中突然不能抓包的问题Fiddler是一款非常方便好用的Http分析工具,不仅能够抓取数据包,也能够模拟发送HTTP请求,保存会话,断点调试等等功能。掌握并善于使用这款工具,对于我们的开发也是非常有用。对于新手而言,可能会出现突然不能抓包的问题,如下图:虽然1处并没有勾选Filters,但是左侧观察列表下面显示了Filters,这是之前点击了列表中的相关项,然后设置了Filter Now.如果要恢复到之前,有两种方法:1):鼠标右键Filters右侧蓝色部分,
2020-08-15 23:18:28
1572
1
原创 C++通过调用基类的纯虚函数间接实现多态
下面演示了通过基类的虚函数,来间接实现多态:#include "stdafx.h"#include<iostream>#include<string>using namespace std;//Test1//class IPerson//{//public:// IPerson() { cout << "this is construction in IPerson" << endl; }// virtual void SetN
2020-05-29 17:46:38
662
原创 MFC将Unicode编码的CString对象写入到txt文本文件中
参考博文:https://blog.csdn.net/x763795151/article/details/51604350在向文件写入内容的时候,要加入标志位。#define TCHARLEN (sizeof(TCHAR))void CfxcoreDemoView::EndDoPage(){ CFile file; file.Open(L"..\\Text.txt", CFile::modeCreate | CFile::modeWrite /*| CFile::modeNoTr
2020-05-26 18:08:46
536
原创 C++ List的Remove和erase比较
Remove和erase都可以进行数据的移除,区别在于Remove移除的是List中所有与待移除项相等的数据,而erase移除的是迭代器所指的内容。 Remove有一个是否相等的比较,因此我们在Remove自定义的数据时,要添加“==”运算符的重载实现。 下面给出一个简单的演示例子: #include<iostream>#include<iterator>#include <list>using namespace std;#define R..
2020-05-09 21:51:08
1140
1
原创 C++使用类名强制指定调用的函数
#include<iostream>using namespace std;class A{public: void foo() { printf("1\n"); } virtual void fun() { printf("2\n"); }};class B : public A{pub...
2019-11-30 16:33:19
1532
原创 stm开发知识经验笔记
一):添加的库文件,在删除之后,同样需要进行在工程中remove相应的文件 ...................................会持续更新的
2018-07-04 22:58:17
196
原创 stm宏定义使用及注意事项
笔者接到一个C51单片机的工程要转移到stm上来,然后有一些思索感受,遂做个简单的记录。使用宏定义的好处大家都熟知,便于移植与维护,清晰直观,因此要善于应用,方便自己也方便他人;51的数据输入输出寄存器是同一个,而且输入输出方向寄存器是分开的,因此,在移植的时候要多一些工作!下面是51的原工程部分代码:#define CHIP_MODE_GPIO ...
2018-06-11 12:16:19
424
原创 电路焊接及工具使用学习总结
一:电路焊接的技巧1)对于电路中有较多的公共连接段(如Gnd),则分别引出到万用板上的其他地方,并呈线性排列,这样比较直观,显得有条理,最好不要簇拥在一块。2)接地线Gnd用同样一种颜色的飞线(如黑色),接电源Vcc的用同样一种颜色飞线(如红线),当线路比较复杂时,这样有利于排查线路。3)保证万用板的背面的所有节点漏线不要相交,不能重合在一起,应在正面通过焊锡进行连接,这样可以避免一些短路现象的发...
2018-05-24 11:58:44
6292
原创 stm串口通信常见问题及解决含第一个字符不能够成功发送
笔者由于项目的需求,做起了stm与PC的串口通信工作。由于是新手,一路上磕磕绊绊,踩了不少坑,这儿做下记录(ennn~,几天不写博客,感觉自己懒了),大家可以参考~一):分频系数要写正确 下面是初始化函数:void Init_UART1(void){ UART1_CR1=0x00; UART1_CR3=0x00; UART1_BRR2=0x00...
2018-05-14 22:38:12
2736
原创 shell脚本的简单使用
笔者在工作时,涉及到了一些自动化测试,这时可以使用shell脚本,方便快捷,下面为简单的演示: #!/system/bin/shecho "Test Success!"date +%schmod 777 test3.sh第一行为解释执行的路径,第二行为打印输出,第三行为打印日期,第四行为修改文件的属性。当然,这里给的演示很简单,shell脚本功能很强大,介于系统与底层之间,对于一些Kerne...
2018-04-26 11:39:24
138
原创 DFS求和是否等于一个数
给出一个数组,然后判断其所有组合中是否能够使得和为一个给定的值,给出DFS代码如下:#include<stdio.h>int arr[7] = { 1, 2, 4, 8, 16, 32, 64 };void dfs(int x, int start, int len, int sum){ if (x == sum) { printf("和为%d的情况存在...\n",...
2018-04-25 18:26:56
528
转载 DFS走迷宫
下面给出DFS算法走迷宫的代码:#include <stdio.h>char map[50][51]; //地图上限50*50 int sign[50][50]; //标记 int next[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };int n, m; //实际地图行数、列数 int end...
2018-04-25 17:51:10
575
原创 案例讲解-哈夫曼编码的使用
下面模拟对原文本进行编码,然后传输后,进行相应的解析得到原有的数据,真个过程也可以看作是一个典型的压缩、解压缩操作,具体演示代码如下:#include <stdio.h>typedef struct INPUT{ unsigned char * data; int len;}INPUT;void test(INPUT test, char code[][21]);v...
2018-04-25 17:28:15
1666
OpenGL ES 3.0 Programming Guide(2nd Edition)(中英文).rar
2018-04-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人