- 博客(37)
- 资源 (3)
- 收藏
- 关注
原创 队列-链式描述(C++)
队头指针(Front Pointer):指向队列中第一个(即最早进入队列的)元素的节点。队尾指针(Rear Pointer):指向队列中最后一个(即最近进入队列的)元素的节点。节点(Node):每个节点包含数据域和指向下一个节点的指针。入队:在队尾添加新元素。出队:移除队头元素。查看队头元素:获取队头元素但不移除它。检查队列是否为空:判断队头指针是否为空或者判断size是否为0。
2024-12-01 23:11:48
318
原创 栈-数组描述(C++)
栈顶指针(Top Pointer):用于指示栈顶元素的位置。栈顶指针的初始值通常设置为-1,表示栈为空。栈底(Bottom):数组的起始位置,通常固定。栈容量(Capacity):栈可以容纳的最大元素个数,由数组的大小决定。压栈(Push):将新元素添加到栈顶。弹栈(Pop):移除栈顶元素。查看栈顶元素:获取栈顶元素但不移除它。检查栈是否为空:判断栈顶指针是否为-1。抽象类stackpublic:派生类arrayStackpublic:void pop();
2024-12-01 23:06:57
359
3
原创 线性表-链式描述(C++)
链式实现的线性表,即链表(Linked List),是一种通过节点(Node)的集合来存储数据的线性数据结构。在链表中,每个节点包含两部分:存储数据的域(数据域)和指向下一个节点的指针(指针域)。链表中的节点通过指针相互连接,形成一个序列。
2024-12-01 18:37:24
269
原创 线性表-数组描述补充 迭代器(C++)
随机访问迭代器(Random Access Iterator):支持在常数时间内访问序列中的任意元素,并提供了丰富的算术运算能力。双向迭代器(Bidirectional Iterator):支持双向遍历,即可以向前也可以向后逐个遍历元素。前向迭代器(Forward Iterator):支持单向遍历,并允许多次遍历同一序列(即支持多次读取)。typedef是C语言中的一个关键字,它的主要作用是为一种数据类型定义一个新的名字(别名)。输出迭代器(Output Iterator):只写,支持单向遍历并写入元素。
2024-11-12 22:59:31
207
原创 QT中的D指针和Q指针
D指针和Q指针实际上是类的成员指针变量,分别指向一个私有类(通常称为Private类)对象和一个公有类对象。这种设计模式的核心是将类的实现细节与接口分离,从而减少编译依赖,提高代码的灵活性和可维护性。
2024-10-20 23:04:57
667
原创 线性表-数组描述(C++)
数组是一种静态的数据结构,在声明时需要指定其大小,之后无法改变。数组中的元素通过索引(通常是整数)进行访问,索引从0开始。
2024-10-17 23:33:56
323
原创 桥接模式(C++)
桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式主要用于当系统的抽象部分和实现部分需要独立地进行扩展时,使得两者之间的耦合度降低。
2024-10-13 15:05:33
401
原创 中介者模式(C++)
中介者模式(Mediator Pattern)是一种行为设计模式,用于松散地耦合一组对象,使它们通过中介者对象进行通信,而不是直接相互引用。这有助于减少对象之间的依赖性和复杂性,同时提高代码的可维护性和可扩展性。观察者模式是被观察者发生变化通知每个观察者,核心觉得是被观察者和观察者。但中介模式的核心是中介者,它负责协调和控制一组对象之间的交互,一个对象发生变化或进行操作时,中介者负责将变化或操作传到给其他对象。通过引入中介者或观察者机制,使得对象之间的交互更加清晰和可控。
2024-10-13 14:54:46
411
原创 状态模式(C++)
状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式将状态相关的行为封装到单独的类中,并将这些对象组合成状态模式,允许状态对象在运行时改变行为。
2024-10-13 13:28:43
381
原创 责任链模式(C++)
责任链模式(Chain of Responsibility)是一种行为设计模式,它允许你将请求沿着处理者链进行传递。每个处理者都有机会处理请求,如果某个处理者不能处理该请求,则可以将请求传递给链中的下一个处理者。这个模式使得你可以在不修改现有代码结构的情况下,动态地添加或删除处理者,并且可以将请求和处理者解耦,使得请求可以发送给一系列的处理者而无需关心哪个处理者会实际处理它。
2024-10-13 13:06:43
414
原创 访问者模式(C++)
这个模式适用于数据结构相对稳定,但对其操作易于变化的情况。通过将操作封装在访问者类中,你可以在不修改数据结构的情况下增加新的操作。ObjectStructure(对象结构):能够枚举其所有元素,并可以允许访问者访问这些元素。ConcreteVisitor(具体访问者):实现每个访问操作,这些操作对数据结构中的元素执行具体操作。Element(元素):定义一个接受访问者对象的操作,这个操作通常是 accept 方法。Visitor(访问者):定义一个或多个访问操作,这些操作应用于访问对象结构中的元素。
2024-10-13 12:50:15
340
原创 C++静态绑定、动态绑定
静态绑定是指在编译时确定调用哪个函数,即在编译期间就已经确定了函数的调用路径。这种绑定方式在编译时就已经完成,因此也被称为静态多态或编译时多态。动态绑定是指在运行时确定调用哪个函数,即编译器不确定要调用哪个函数,而是将函数调用委托给运行时系统来决定。这种方式也被称为动态多态或运行时多态。
2024-10-13 11:27:49
269
原创 C++虚函数表
创建子类对象时,当基类中有虚函数时,会在编译时生成基类的虚函数表(实际上是保存在子类对象空间中,只不过这时结构上是基类虚函数表的结构)。当子类中重写了基类的虚函数,会将子类的函数地址更新到虚函数表中,并且当子类新增了虚函数,也会把新增的虚函数地址扩展到虚函数表中。当调用虚函数时,无论这个虚函数在子类中有没有重新实现,都会去虚函数表中寻找该函数的地址,如果子类没有实现,这时的函数地址还是基类的函数地址,如果子类重新实现了该虚函数,则找到的是子类更新到虚函数表中的虚函数地址。
2024-10-13 11:24:55
208
原创 装饰器模式(C++)
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于对象结构型模式,它是通过创建一个包装对象,也就是装饰器,来包裹真实的对象。
2024-10-13 10:58:03
411
原创 建造者模式(C++)
建造者模式(Builder Pattern)是一种创建型设计模式,它主要用于构建一个复杂对象,并将其构建过程与表示分离,使得同样的构建过程可以创建不同的表示。该模式通过将复杂对象的构建过程分解为多个简单的步骤,每个步骤由独立的建造者对象负责,从而实现了构建过程的可控性和灵活性。
2024-10-13 01:00:56
557
原创 原型模式(C++)
原型模式是一种创建型设计模式,它允许通过复制(或克隆)一个已经存在的对象来创建一个新的对象,而无需重新实例化它。这通常是通过实现一个原型接口,该接口声明一个克隆方法,然后在具体类中实现这个方法来完成的。
2024-10-13 00:16:35
393
原创 享元模式(C++)
享元模式是一种结构型设计模式,它使用共享对象,用以尽可能减少内存使用和提高性能。享元模式通过共享已经存在的对象实例,而不是每次需要时都创建新对象实例,从而避免大量重复对象的开销。对比:两者都限制了对象的创建,不同之处在于单例模式全局只有一个实例,而享元模式会在状态相同时共享同一个实例。对比:虽然原型模式不涉及状态的共享,但通过现有对象来创建一个新对象,达到了新对象和原对象“内容”上的一致。
2024-10-12 23:55:59
396
原创 适配器模式、代理模式(C++)
对比:两种设计模式的相同之处在于都使用中间层隔离了对真实接口的访问,不同之处在于适配器模式主要针对接口不兼容的问题,而代理模式的主要目的是控制对对象的访问或添加额外的处理逻辑。适配器模式是一种结构型设计模式,它允许接口不兼容的类一起工作。它通过将一个类的接口转换成客户端期望的另一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。代理模式也是一种结构型设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,可以添加额外的控制或处理逻辑。
2024-10-12 23:39:04
740
原创 组合模式(C++)
组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。文件和文件夹可以看作是一种树形结构,文件夹可以包含文件和子文件夹,而文件则不包含其他对象。使用组合模式可以方便地遍历文件系统。
2024-10-12 23:21:51
350
原创 命令模式和备忘录模式实现undo、redo(C++)
例如,在命令模式中引入备忘录模式来保存命令执行前后的状态,从而更方便地实现撤销和重做功能。命令模式是一种行为型设计模式,它将一个请求封装成一个对象,从而允许使用不同的请求、队列或日志请求,并支持可撤销的操作。命令模式的核心思想是将请求的发送者与请求的接收者解耦,使得请求的发送者无需知道接收者的具体实现,从而提高了系统的灵活性和可维护性。备忘录模式是一种行为型设计模式,也叫做快照模式(Snapshot),它允许在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。
2024-10-12 22:59:08
839
原创 模板方法模式、策略模式(C++)
将策略模式中的策略抽象出来,实现步骤延迟到子类中去实现,在使用策略时根据具体需求去实现对应的子类,并调用子类实现的具体策略。所以把这两种模式放在一起介绍。定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。定义一个操作算法的框架,实现步骤延迟到子类中去实现。
2024-10-12 22:00:58
575
原创 观察者模式(C++)
对象间的一对多关系,当一个对象状态发生改变的时候,其它依赖于它的对象都会得到广播通知并进行自定义动作,通过。技术的多态技术,可以降低这种依赖关系,降低耦合度。包含订阅者、观察者两种角色。Qt中的信号槽机制就是应用的观察者模式。
2024-10-12 20:37:42
201
原创 工厂、简单工厂、抽象工厂模式(C++)
由于工厂模式下,指针的创建者和使用者大概率不是同一用户,使用智能指针能够避免使用者由于疏忽没有释放指针造成的内存泄露。工厂模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方法。要求产品子类的类型差不多,使用的方法名都相同;抽象工厂模式是一种高级的设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。简单工厂模式是工厂模式中最简单的一种,它通过一个工厂类来创建对象,而不需要客户端知道具体的产品类。当产品类数据较多时,需要实现大量的工厂类,增加了代码量。
2024-10-11 17:31:57
477
原创 单例模式(C++)
原理:当多个线程尝试初始化同一个静态局部变量时,C++11标准保证只有一个线程能够成功执行初始化代码,而其他线程则会被阻塞,直到初始化完成。饿汉模式之所以线程安全是因为在main函数执行之前,全局作用域的类成员静态变量就已经完成了初始化。因此,饿汉模式不需要考虑多线程环境下的线程安全问题,因为实例的创建和初始化在多个线程可能开始执行之前就已经完成了。饿汉模式:优点是绝对的线程安全,但是有可能会增加程序启动时间。:一个类只能有一个实例,并且提供一个可全局访问获取该实例接口。懒汉模式:初次使用的时候初始化。
2024-10-11 15:23:39
419
原创 QSetting缓存机制的坑
在工作中遇到这么一个问题,使用QSetting打开配置文件后,更新覆盖了一下被打开的文件,结果读取出来的内容还是原先的内容。查了一下博客,发现QSetting是缓存在内存中的,再次打开是直接从内存中打开。...
2021-01-04 16:13:33
706
原创 Windows,Unix,MacOs系统下文本文件的转换
经常遇到各个系统下的文件拷贝来拷贝去,看着没问题,也不乱码,但是一编译或者一执行就出问题,你可能得看看这篇文章了。首先,用notepad++打开一个文件。它应该是这样的。紧接着,视图->显示符号->显示所有字符,它就变成了这样。这就是问题所在了,接下来,编辑->文档格式转换->转换为Unix。它就变成了这样。明白问题所在了吧,就是这个换行符的问题。...
2020-09-29 13:46:59
1078
原创 新的单例模式,std::call_once C++11新特性
通过C++11新特性std::call_once 来调用某个函数,只能成功调用一次,调用成功后再次调用不会执行,调用失败再次调用还会执行。用来调用某个单例的初始化函数比较合适,而且对于线程是安全的。...
2020-09-17 16:37:14
327
原创 Qt项目中引用的公共代码,通过宏定义匹配代码块
在一些大型项目中会存在一些公共代码,但在这些公共代码中又需要根据引用的具体项目去实现一些特定的代码,这时候一般是通过宏定义的方式去判断目前所引用代码的项目是哪个项目,来决定某些代码是否生效。#ifdef PROJECT_A//A需要生效的代码#else if PROJECT_B//B需要生效的代码#endif通过这种方式能够进行区分,上面写的PROJECT_A,PROJECT_B是在项目pro文件中进行定义的DEFINES += ROLE_STUDENT...
2020-09-17 16:29:44
371
原创 Qt配置项目编码格式
Qt中pro文件配置编码格式:msvc:QMAKE_CXXFLAGS += -charset:utf-8pro中变量含义:https://www.cnblogs.com/senior-engineer/p/8469297.html
2020-09-17 12:26:16
1365
1
原创 C++Socket学习笔记—— windows.h和WinSocket2.h的冲突
如何解决windows.h和WinSocket2.h的冲突最近在学习c++网络编程,刚一 开始就遇到了一个问题,就是引入windows.h和WinSocket2.h头文件之后生成失败,警告信息是下面这样的。意思就是说发生了很多宏定义冲突,而且这些宏定义都是接下来的socket编程需要用到的。在网上查了很多资料,简单来说呢,原因就是windows.h头文件中已经包含了很多关于sock...
2019-01-12 20:51:55
3145
原创 Qt下的国际化方法—翻译文件(.ts .qm文件)的使用
1.获取所需翻译的文本在代码中需要翻译的文本的都需要用下面的方式使用 tr() 括起来。//创建菜单子项 manageAction = new QAction(tr("vehicle management"),this); chartAction = new QAction(tr("Sales statistics"),this); quitAction = ne...
2019-01-07 17:03:42
17914
8
原创 QT下欢迎页面的自动跳转——事件过滤器(eventFilter)和定时器的应用
1.练习背景 这次的练习也是项目当中实际要用到的一个功能,就是所谓的欢迎界面。 在现在大多数客户端程序中呢,欢迎界面能够起到很大的作用,不只是字面的欢迎,还可以提示一些注意事项,或者是展示跟自家公司相关的广告或产品。 本次练习呢,不涉及页面的展示内容,只是去实现一个欢迎页面自动跳转的功能。2.所用技术点 实现欢迎页面除了常用的一些信号,窗口类的常用操作之...
2018-12-27 12:13:25
1141
1
原创 QT项目日记——使用QSetting区分导入的文件是否符合要求(不是区分后缀名)
1.需求 由于设备的不同,需要在导入文件的时候,区分文件是否和设备匹配。 PS:设备编号已经获取到,能够直接使用。2.需求分析 通常导入文件的时候需要区分的只是文件的后缀名,至于文件的内容则是在使用的时候进行检查。 但是这次是需要在导入文件的过程中,进行对文件内容的检查,并获取其中的某个字段,跟设备类型进行匹配。 PS:文件内容为键值对类型,所以...
2018-12-24 17:28:50
499
原创 Qt下的自定义控件——通过继承QComboBox并重写event来实现想要的效果
1.需求 在项目当中呢,需要做一个根据QComboBox的子项显示相应数据的功能,这个很简单,通过QComboBox自有的activated信号就能解决。但是呢,又需要在切换QComboBox子项时,把当前子项相关的那部分数据记录下来,否则切换一次子项再切换回来之前修改的数据就白做了。2.需求分析 首先一点,这个需求呢,是想要在你切换子项这个动作发生或者将要发生的时候,...
2018-12-20 13:29:19
5087
2
原创 Qt下的Tcp协议练习——客户端
上一篇文章记录了本次聊天室项目服务端的实现过程和主要代码,本篇文章将记录客户端的实现过程和主要代码。至于Tcp的原理,上篇文章已经提到过了,所以在这里就不多啰嗦了。还是一样的套路,上来先初始化控件对象和设置布局,这些都不是重点,可以自己随意布局。 //设置窗口标题 setWindowTitle(tr("TCP Client")); //初始化控件对象 c...
2018-12-14 17:16:22
322
原创 Qt下的Tcp协议练习——服务端
1.Tcp协议的原理Tcp协议是一种可靠、面向连接、面向数据流的传输协议,适合数据的连续传输。Tcp协议能够确保一台计算机发出的数据无差错的传输给网络上的其他计算机,但是在传输数据前,必须建立连接(三次握手)。2.传输过程首先,服务端和客户端通过三次握手建立连接。然后,客户端向服务端发送一个请求,服务端处理这个请求,并向客户端返回一个响应,这个过程会一直持续。直到客户端为服...
2018-12-14 09:52:08
499
原创 Qt下的Udp协议练习
1.UDP的工作原理客户端向服务端发送一段请求报文,报文大小与各个系统的协议实现有关,但不能超过下层IP协议规定的64KB;服务端同样以报文的形式作出相应,如果服务端没有收到请求,则不会作出回应,客户端也不会重新发送,所以报文传输的可靠性不高。2. 实例服务端: port=5555;//设置UDP的端口,服务端定时向此端口发送广播 udpSocket = new...
2018-12-13 13:46:57
1118
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人