c++全栈聊天项目
1. 简介本项目为c++全栈聊天项目实战,包括PC端QT界面编程,asio异步服务器设计,beast网络库搭建http网关,nodejs搭建验证服务,各服务间用grpc通信,server和client用asio通信等,也包括用户信息的录入等,实现跨平台设计,先设计windows的server,之后再考虑移植到linux中,较为全面的展示c++在实际项目中的应用。
1.在QT创建一个主界面:
新建—>Application—>Qt Widgets Application—>项目名称为lxxchat—>类名为MainWindow—>基类为QMainWindow
2.创建一个登录的对话框:
新建—>Qt—>Qt设计师界面类—>选择界面模板:Dialog without Buttons—>类名为:LoginDialog
3.创建一个资源文件:
新建—>Qt—>Qt Resource File—>名称为rc
4.创建一个注册的对话框
新建—>Qt—>Qt设计师界面类—>选择界面模板:Dialog with ...
设计模式
1. 设计模式三原则在进行程序设计的时候,要尽可能地保证程序的可扩展性、可维护性和可读性,所以需要使用一些设计模式,这些设计模式都遵循了以下三个原则。
1.1 单一职责原则C++面向对象三大特性之一的封装指的就是将单一事物抽象出来组合成一个类,所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。
设计模式中所谓的单一职责原则:就是对一个类而言,应该仅有一个引起它变化的原因,其实就是将这个类所承担的职责单一化。
1.2 开放封闭原则开放封闭原则:指的是软件实体(类、模块、函数等)可以扩展,但是不可以修改。也就是说对于扩展是开放的,对于修改是封闭的。
开放封闭原则是面向对象设计的核心所在,这样可以给我们设计出的程序带来巨大的好处,使其可维护性、可扩展性、可复用性、灵活性更好。
1.3 依赖倒转原则关于依赖倒转原则,对应的是两条非常抽象的描述:
高层模块不应该依赖低层模块,两个都应该依赖抽象。
高层模块:可以理解为上层应用,就是业务层的实现
低层模块:可以理解为底层接口,比如封装好的API、动态库等
抽象:指的就是抽象类或者接口,在C++中没有接口,只有抽象类
抽象不应 ...
c++11新特性
1. 原始自变量定义原始字符串的方式为:R “xxx(原始字符串)xxx”,其中()两边的字符串可以省略(不省略的时候就要求一样)。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。
用途:主要是防止一些特殊字符,如\t,\n等对想输出的字符串产生影响。
测试程序:
1234567891011121314151617int main() { string str1 = R"hello(D:\hello\world\test.text)hello"; //后面的hello为world就会报错 cout << str1 << endl; string str2 = R"(<html> <head> <title> 海贼王 </title> </head> <body> <p> 我是要成为海贼王的男人 </p> </body></html>)"; cout &l ...
八股文2
1.基本知识
sizeof :是C/C++中的操作符,用来计算一个类型/对象的所占用的内存大小(字节数),包括最后的\0
sizeof 和 strlen 的区别:strlen是一个 C 标准库中的函数,用于计算以空字符 \0 结尾的字符串的实际长度(不包括结尾的空字符)
char array[]数组作为函数参数时会退化为指针,大小要按指针的计算。这时sizeof()会返回指针的大小;strlen()还是返回字符串实际长度
volatile:是 C 语言中的一个关键字,用于修饰变量,表示该变量的值可能在任何时候被外部因素更改,例如硬件设备、操作系统或其他线程。当一个变量被声明为volatile时,编译器会禁止对该变量进行优化,以确保每次访问变量时都会从内存中读取其值,而不是从寄存器或缓存中读取。避免因为编译器优化而导致出现不符合预期的结果
字节对齐有助于提高内存访问速度,因为许多处理器都优化了对齐数据的访问。但是,这可能会导致内存中的一些空间浪费
字节序是指在多字节数据类型(如整数、浮点数等)中,字节在内存中的存储顺序。主要有两种字节序:
大端字节序(网络 ...
八股文1
0. C++的三大特性
封装是指将数据和操作这些数据的方法绑定在一起作为一个单元(通常是一个类),并通过访问修饰符(public、protected和private)来限制对这些成员的直接访问。封装的主要目的是保护对象的内容不被外部随意修改,从而提高安全性并减少错误的发生
继承允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。这有助于代码重用,并能建立类之间的层次关系。
单继承与多重继承:C++支持单继承(一个子类继承自一个基类)和多重继承(一个子类同时继承多个基类)
继承方式:包括公有继承(public)、保护继承(protected)和私有继承(private),不同的继承方式会影响派生类对外部可见性的处理
多态指的是能够在运行时决定调用哪个函数的能力,即同一个函数接口可能对应多种实现形式。在C++中,多态主要通过虚函数实现
虚函数:在基类中声明为虚函数的成员函数可以在派生类中被重写,以提供特定的行为
动态绑定:当使用基类指针或引用指向派生类对象时,如果调用了虚函数,则实际调用的是派生类中的版本,这种机制称为动态绑定或晚绑定
1. malloc、free和 ...
Http高并发服务器项目
1. 简介该项目的架构是B/S架构,也就是说客户端是浏览器,在本地随便一个浏览器即可;服务器是在linux上搭建的一个应用程序,该程序可以是多线程版的,也可以是单反应堆模型或者是多反应堆模型,反正最终都可以给客户端提供服务。
过程:
客户端(浏览器)向服务器发送一个Http请求,服务器就能把指定目录下的资源给到客户端(浏览器),浏览器就能将得到的数据展示到界面上。如果解析不了该文件,就会自动下载到本地,如果能够展示,它在本地指定的下载目录是不会有对应文件的,因为它下载到本地之后,就直接将内容显示到窗口上了,可以理解为它下载下来的只是一个缓存,该缓存能够支撑它在浏览器上把内容显示出来,当数据显示完成之后,浏览器会定期地清除缓存,那么该资源也就不存在了。
2. 单反应堆的服务器模型在网络编程中,为了提高访问通信的效率,就可以使用单反应堆的服务器模型,它是IO多路复用与多线程相结合的一种技术。
设计思路:
在主线程里面,服务器绑定本地的ip和端口来得到一个通信的套接字,因为通信的套接字需要监听它的读事件,所以就将它的读事件注册给Reactor,也就是反应堆模型。该反应堆模型底层用到 ...
Qt斗地主项目(下)
1. 结束面板窗口类EndingPanel结束面板窗口类是用于在当一个玩家打完自己手中的牌时,也就意味着游戏结束。当结束的时候,会在主窗口的正中间跳入一个结束面板窗口,上面记录了各个玩家的得分。
结束分数面板窗口类:新建、c++、c++clase、类名为EndignPanel,基类为QWidget。
1.1 EndingPanel类头文件结束面板窗口类的头文件主要就是定义一些有关结束面板的私有变量,如背景、按钮等。同时也定义一个关于是否继续游戏的信号。
123456789101112131415161718192021class EndingPanel : public QWidget{ Q_OBJECTpublic: explicit EndingPanel(bool isLord, bool isWin, QWidget *parent = nullptr); //获取玩家的得分,并显示 void setPlayerScore(int left, int right, int me);signals: void continueGame(); ...
Qt斗地主项目(上)
1. 简介这是一个基于Qt开发的单机版的斗地主小游戏。该项目一共涉及到的类有如下:
1.卡牌类
单张卡牌:Card
多张卡牌:Cards
2.玩家类
玩家类(父类):Player
机器人玩家(子类):Robot
非机器人玩家(子类):UserPlayer
3.窗口类
游戏开始加载动画窗口:Loading
游戏主窗口:GamePanel
单张卡牌窗口:CardPanel
特效动画窗口:AnimationWindow
游戏窗口中的按钮窗口:ButtonGroup
游戏结束玩家的成绩窗口:EndingPanel
自定义按钮:MyButton
游戏分数面板窗口:ScorePanel
4.游戏策略类
出牌类:PlayHand
游戏策略类:Strategy
5.游戏控制类
游戏控制类:GameControl
6.线程类
机器人玩家抢地主:RobotGrapLord
机器人玩家出牌:RobotPlayHand
7.音频类
控制播放游戏中的所有音频:BGMControl
首先,创建一个项目,项目名为Landlords,再创建一个游戏主窗口类Ga ...
QT基础
1. 简介1.1 什么是QtQt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展以及一些宏,Qt很容易扩展,并且允许真正的组件编程。
Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境(IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。即使不开发Qt应用程序,Qt Creator也是一个简单易用且功能强大的IDE。
Qt是一套应用程序开发库,但与MFC不同,Qt是跨平台的开发类库。跨平台意味着只需要编写一次程序,在不同平台上无需改动或只需要少许改动后在编译,就可以形成在不同平台上运行的版本。
1.2 Qt特征1.面向对象
Qt具有模块设计和控件或元素的可重用性的特点。一个控件不需要找到它的内容和用途,通过Signal和slot与外界通信、交流。而且Qt的控件都可通过继承。
2.控件间的相互通信
Qt提供signal和slo ...
c++并发编程(下)
1. 引用计数实现无锁并发栈1.1 简介在C++并发编程中提出了两种计数,一种是外部计数,一种是内部计数,二者加起来就是有效的引用计数,下面提出一种新的方法,利用引用计数实现无锁并发的栈。
1.2 代码实现栈结构函数:栈函数里面实现了栈的默认构造函数、析构函数和创建了一个原子类型的头部节点,同时也定义好了栈的内部节点类型。
12345678910111213141516171819template<typename T>class single_ref_stack {public: single_ref_stack():head(nullptr) {} //默认构造函数 ~single_ref_stack() { //析构函数 while (pop()); //循环出栈 }private: struct ref_node { //引用节点(栈的内部节点) st ...