C和C++面试秘籍(董山海)分享 C和C++面试秘籍(董山海)分享最近在找面试相关的知识点,找到一本不错的书籍,过程比较艰难,特将其分享,需要请自取链接:https://pan.baidu.com/s/160OAtCsDCI-js8GYy_QhSQ提取码:dfr1如果链接失效请联系本人:1835833302@qq.com...
Openssl编程入门(一) 文章目录Openssl编程入门(一)Openssl简介Openssl安装Openssl生成密钥和证书生成私钥生成证书签名请求生成自签名SSL证书Openssl编程入门(一)Openssl简介OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。
C语言不定参数函数 文章目录C语言不定参数不定参数不定参数实现原理示例代码C语言不定参数众所周知,C语言不支持函数重载,支持函数重载的是C++。究其原因,C语言在编译函数之后,将"_函数名"存放到函数库,而C++在编译函数之后,将"_函数名_参数类型_参数类型"存放到函数库但是,在查询fcntl函数时,却发现其函数原型有多个int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct
gcc 编译提示/usr/include/stdio.h:27:23: fatal error: features.h: No such file or directory 使用Ubuntu编译c程序时,编译器提示/usr/include/stdio.h:27:23: fatal error: features.h: No such file or directory # include <features.h>产生原因: 自己在安装一些库的时候破坏了GCC的编译环境解决方法: 安装gcc-multilib工具具体方法:终端输入sudo apt-get install gcc-multilib(Ubuntu)安装完毕之后重新编译程序,即可编译成功gc
Qt程序运行之后不显示窗体 Qt程序运行之后不显示窗体原因:误将类成员函数名称命名为show在进行程序编写时,我发现程序执行之后程序只将qDebug打印的信息输出到控制台,但是没有显示程序窗体,经过排查发现自己定义了一个成员函数show用于输出指定信息QtCreator创建的项目的main.cpp中,默认程序内容如下:#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication
Qt日志重定向(将qDebug信息输出到界面控件) Qt日志重定向程序日志对于输出程序运行信息有着非常重要的作用,它可以帮助程序员定位问题所在,输出程序运转状态等在使用QtCreator编写程序时,我们可以使用qDebug方便的将自己需要的信息输出,但是如果想将其显示到程序的控件上,又该怎样做呢?经过一番搜索,我找到了将qDebug重定向的方法,可以将其输出的信息自由的存放到ui控件或文件中(搜到的大部分教程都是将日志信息重定向到文件中,容易让人误以为它只能重定向到文件)qInstallMessageHandler由于本人开发环境为Qt5,因此本文
树莓派和上位机使用TCP通信(字符串和图像传输) 文章目录树莓派和上位机使用TCP通信系统介绍字符串通信树莓派具体实现代码:Qt具体实现代码:程序执行图像发送树莓派具体实现代码:Qt具体实现代码:程序执行树莓派和上位机使用TCP通信系统介绍下位机: 树莓派作为下位机,IP地址为192.168.199.206,作为tcp的客户端(c实现),通信端口号为8888,上位机: Ubuntu(虚拟机)作为上位机,作为tcp的服务端(Qt实现),Qt版本为5.12,IP地址为192.168.199.149,通信端口为8888注意:该系统为单向通信,只能由
OpenCV拍摄图像(C++) OpenCV拍摄图像(C++):定时拍摄和按键拍摄使用摄像头进行图像拍摄是常见的需求,一般分为两种拍照方式:定时拍照和按键拍照如果你还没有完成Linux环境下使用OpenCV调用摄像头,请参考本人另一篇博客OpenCV读取摄像头定时拍摄...
QCharts绘制柱状图,柱高和y轴数据刻度不匹配 QCharts绘制柱状图,柱高和y轴数据不匹配使用QCharts之前,需要确保自己在安装Qt组件时,选中了Charts这一组件如果需要使用QCharts绘制柱状图,需进行以下设置//在项目pro文件中添加以下内容QT += charts//在.h文件中添加以下内容,注意:需要将头文件及命名空间添加到ui命名空间之前,否则将提示错误#include <QtCharts/QChartView>#include <QtCharts/QBarSeries>#in
树莓派安装OpenCV 树莓派安装OpenCV树莓派是一种ARM架构的小型Linux硬件设备,其中运行了一套完整的Linux系统,但是和X86架构不同的是,如果需要在树莓派安装OpenCV,需要交叉编译当然,如果交叉编译过于繁琐的话,可以直接将OpenCV的安装包拷贝到树莓派上,在树莓派直接编译,具体方法可参照本人博客:Linux 安装OpenCV本人实测编译树莓派3B速度大概为六个小时,还是可以接受的推荐开发环境:树莓派是自带WIFI模块的,只需要连接显示器之后,连接需要的WIFI,之后即可使用XShell等网络挂载,
树莓派连接WIFI可以挂载SSH吗? 树莓派连接WIFI可以挂载SSH吗?可以,挂载方法和有线连接一样,具体挂载方法可以参照本人另外一篇博客 树莓派挂载SSH需要注意的是,在连接之前,需要打开树莓派的SSH服务开关,因为其默认为关闭并且连接之前需要事先知晓树莓派的IP地址...
对象数据成员的初始值 对象数据成员的初始值对象的构造函数的作用是初始化类的成员变量,但是如果我们不显式定义构造函数,编译器就会给我们定义一个默认构造函数;这个默认构造函数中其实是什么都没有做的,如果这样,我们生成该类的对象之后,它的数据成员值为多少呢?具体程序如下:#include <iostream>using namespace std;class Base{public: int val;};Base b;int main(){ Base c; Base *ba
函数的返回值存放在哪里 函数的返回值存放在哪里调用函数时,函数的返回值存放的位置具体在哪里呢?按照概念来说,函数的返回值应该放在被调用函数运行结束之后,主调函数可以有效访问的地方,也就是说,函数返回值应当存放在主调函数开辟的栈空间但是,计算机硬件的飞速发展使得CPU的通用寄存器字长在不断增长,个数也不断增多,因此在很多情况下,函数的返回值直接被存放在了CPU的通用寄存器中,而并非一定需要计算机的内存空间具体类型的返回值的存放位置如下所示:char(8bit):寄存器a1short(16bit):寄存器axint(32
数据类型转换操作符:const_cast、static_cast、dynamic_cast以及reinterpret_cast 文章目录数据类型转换const_cast的用法使用const_cast需要注意的问题:static_constdynamic_castreinterpret_cast数据类型转换在c++编程中,我们经常需要使用到类型转换,但可能不熟悉c++内置的四种类型转换操作符它们分别是:const_cast、static_cast、dynamic_cast以及reinterpret_cast,它们的语法形式是统一的,type_cast_operator(expression)const_cast主要用于解除
C++宽字符类型wchar_t C++宽字符类型wchar_t传统的字符数据类型为char,占用一个字节,存放的数据内容为ASCII编码,最多可以存放255种字符,基本的英文以及常用字符都可以涵盖随着计算机在国际范围内普及,大量使用其它语言的计算机用户也纷纷出现,传统的ASCII编码已经无法满足人们的使用,因此一种新的字符存放类型wchar_t应运而生wchar_t为宽字符类型或双字符类型,它占用两个字节,因此能够存放更多的字符wchar_t的使用实例如下所示:#include <iostream>using na
explicit的用法 explicit的用法explicit关键字的作用是:禁止隐式调用类的单参数构造函数,主要禁用以下两种操作:禁止隐式调用拷贝构造函数禁止类对象之间的隐式转换类对象之间的隐式转换是指利用一个已经存在的其它类型的对象来创建本类的新对象,且不显式的调用类的构造函数类对象之间的隐式转换也很常见,例如:A a = 6;就是一个隐转换,它利用6创建一个A类的对象且没有显式调用A的构造函数A(66)隐式调用具体实例如下:#include <iostream>using namesp
C++拷贝构造函数 C++拷贝构造函数拷贝(复制)构造函数是类构造函数的一种,该构造函数只有一个参数,那就是此类的引用例如:类A创建了一个对象a1,并给它赋予特定的属性,之后程序需要创建一个和a1一样的对象,那么就可以使用A a2(a1);来创建相同属性的对象如果程序员不设计类的拷贝构造函数,则编译器就会自动生成默认的拷贝构造函数,一般情况下,默认拷贝构造函数从源对象逐字节复制到目的对象拷贝构造函数被调用的情况使用一个对象初始化另一个对象具体使用实例如下:#include <iostream>
子类使用connect之后提示父类没有槽函数 在子类中使用connect创建信号槽连接时,收到了错误提示如下:QObject::connect: No such slot Board::on_btn_SimpleClicked()问题十分简单,只需要在子类中添加Q_OBJECT即可,具体添加位置如下:class child : public father{ Q_OBJECTpublic: child();}但是,添加之后程序仍提示错误,原因在于没有将之前程序生成的中间文件删除,已经两次忘记清空中间文件,特记录备忘.
C语言函数调用过程(汇编分析) C语言函数调用过程(汇编分析)函数调用主要的三个方面是函数名、参数列表和返回值,想要深入了解函数的调用机制,就需要深入底层,分析源文件的汇编码来分析函数调用的流程函数调用的步骤如下:函数参数传入函数栈帧开辟函数返回值函数栈帧回退所谓栈帧,就剩为一个函数调用单独分配的栈空间图片来源:简书金戈大王函数参数的传入和函数的返回值很好理解,它们函数输入和输出,但是函数栈帧的开辟和回退的具体作用又是怎样的呢?函数的本意是可以重复使用的代码块,在CPU执行程序时,是逐行执行的;如果遇到函数调用,
volatile的用法 volatile的用法volatile是“易变的”、“不稳定”的意思。volatile是C++的一个关键字,它用来解决变量读取的一些问题在单任务中,函数体内部,如果在两次读取变量之间没有修改变量值,则编译器会编译出的可执行文件进行优化因为访问寄存器的速度大于RAM的读取速度,所以编译器会减少读取RAM的优化;假如两次访问变量之间没有修改该值,则只会在第一次访问变量时访问RAM(从RAM中读取到的值存放到寄存器),以后会直接访问寄存器但是在多任务中,虽然在两次读取变量时数据未被修改,但是程序中的其它任
不同类型的class的长度 不同类型的class的长度在计算机中,一个数据类型是有固定的长度的,例如:int、float和double等基本类型的变量,但是一个类在计算机中占据多少内存空间呢?使用sizeof运算符可以获取一个数据的长度,我们可以使用该运算符可以计算出class的长度以及其不同状态下所占据的空间大小不同类的定义以及其长度获取代码如下:#include <iostream>using namespace std;class test{ int data; double d;};
mutable的用法 mutable的用法mutable的意思是"可变的",和const的意思正好相反,其作用也是解除常函数无法修改成员变量的限制,因此mutable关键字的使用频率并不高使用mutable需要注意的问题:mutable只能作用于类的非静态和非常量数据成员mutable关键字提示编译其该变量可以被类的const函数修改mutable关键字的使用实例如下:#include <iostream>using namespace std;class student{public:
const的用法 const的用法const是C++语言引入的一个关键字,是“不变的”、“常量”的意思。用const定义的变量,实际上是定义了一个“只读变量”,const组合变量的用法比较容易理解,但是如果配合指针、引用和函数等,就不容易理解,接下来由四个方面介绍const的用法1. const的位置const的位置比较灵活,一般来说,除了修饰一个类的成员函数外,const不会出现在一条语句的最后const使用实例:#include <iostream>using namespace std;in
const变量定义后能被修改吗?可以 文章目录文字常量和常变量文字常量常变量修改const变量的值文字常量和常变量常量可以直观的理解为“值不可改变的量”。在C++中,常量分为文字常量和常变量文字常量文字常量又称为“符号常量”,经编译之后写在代码区,是不可寻址的。而常变量同其它变量一样被分配空间,是可以寻址的文字常量包括数值常量、字符常量和符号常量,其特点就是编译后写在代码区,不可寻址,不可更改程序中有些特殊的标识符或表达式由于满足文字常量的两个条件:不可寻址、不可改变,也可以将它们视为文字常量。它们分别是:静态数组名、枚举常量、全局
C/C++获取字符数组元素个数 sizeof是C/C++中的一个操作符,用于返回传入的数据的长度(字节数)对于一般的元素类型来说,我们通常使用sizeof获取其长度,也习惯使用其获取数据的长度,但是如果对字符数组或者指针进行sizeof操作,往往无法得到我们预期的结果需要获取字符数组长度时,推荐使用strlen函数
#define中定义函数可以使用另一个#define定义的变量吗? 我们都知道#define可以在程序预编译期间对代码进行替换,前两天遇到了一个问题,问预定义的函数中是否可以使用预定义的变量,问题描述可能略微复杂,详细内容如下:#include <stdio.h>#define N 3#define M N*2#define Add(n) N+nint main(){ printf("The add val is: %d",Add(5)); printf("The m val is: %d", M); return
OpenCV学习笔记----读取摄像头 第七个程序:读取摄像头在Linux系统中,”一切皆文件“,它将鼠标、键盘、摄像头设备归类为设备文件在读取视频文件中,我们使用到了VideoCapture来读取视频,传递给该函数的参数是视频文件的路径,即可打开视频文件,相似的是,如果我们将摄像头设备的设备号传递给该函数,它就会打开摄像头,实时获取摄像头中的视频数据通常情况下,一个设备只会有一个摄像头,因此其设备ID通常为0,但该函数的默认参数为-1,表示自动选取摄像头设备程序源代码如下:#include <opencv2/opencv.hpp
OpenCV学习笔记----读取图像中的像素点 第六个程序:获取图片中的像素值程序源码如下:#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;int main(){ Mat img = imread("/home/wang/opencv/project/2/1.jpg"); Mat img_gray; cvtColor(img,img_gray,COLOR_BGR2G
OpenCV学习笔记----边缘检测 第五个程序:边缘检测器Canny边缘检测是一种常见的边缘检测算法,边缘检测的三大准则如下:低错误率的边缘检测:检测算法应该精准的找到图像中的尽可能多的边缘,尽可能的减少漏检和误检最优定位:检测的边缘点应当准确的位于边缘中心图像中任意边缘应当只被标记一次,同时图像噪声不应产生伪边缘Canny边缘检测的步骤:图像灰度化:只有灰度图才能进行边缘检测使用高斯滤波器,以平滑图像,消除噪声计算图像中每个像素点的梯度强度和方向应用非极大值抑制,以消除边缘检测带来的杂散相应应用双非阈值检测来确定真
OpenCV学习笔记----图像变换(图像金字塔) 第四个程序:图像变换在介绍程序之前,首先说明一下图像金字塔的概念图像金字塔是一种经典的图像多尺寸描述方法,它将采样和平滑滤波结合在一起,对图像进行多尺度表示。图像金字塔由不同尺寸的图像叠加而成,通常每一层都是上一层的一半降采样:一种多速率数字信号处理的技术或是降低信号采样率的过程,通常用于降低数据传输速率或者数据大小为了避免高频分量引入输出信号,我们希望首先通过一个高通滤波器来限制信号带宽,使其能在采样频率之内,在OpenCV中,高斯滤波以及降采样可以通过pyrDown()函数来实现和降采样相对的
OpenCV学习笔记----图像平滑 第三个程序:图像平滑图像平滑是图像处理和计算机视觉中最常用、最基本的操作其目的主要是去除图像中的噪声,因为图像平滑是低通滤波,处理过程中往往会使得图像边缘模糊化,因此又称为模糊处理平滑原理图像平滑的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值滤波相当于筛选器,只允许指定范围内的数据通过筛选,其余数据即为噪点,应当舍弃常见的滤波方法:图像平滑的方法很多,包括均值滤波、高斯滤波、方框滤波、中值滤波、双边滤波等示例:高斯滤波高斯滤波是一种线性平滑滤波,适用于消除高斯噪声
OpenCV学习笔记----读取视频 第二个程序:视频视频显示程序代码如下:#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace cv;int main(){ namedWindow("Example2",cv::WINDOW_AUTOSIZE); VideoCapture cap; cap.open("fire.mp4"); Mat frame; while(1)
OpenCV学习笔记----显示图像 第一个程序:显示图片一个简单加载图像并显示的程序#include <opencv2/opencv.hpp>using namespace cv;int main(){ Mat img = imread("/home/wang/opencv/demo/1.jpg"); if(img.empty()) { return -1; } namedWindow("Example1",cv::WINDOW_AUTOSIZE); imshow("Example1",img);
面试题----使用二维数组判断五子棋胜负(C++) 用自己熟悉的语言编写一个函数:输入是一个n*n的二维数组。该数组可以看做是一个五子棋的棋盘。其中某个元素为1代表该位置摆放的是黑子,-1表示白子,0表示没有任何棋子。函数的返回值是判断该五子棋盘的状态,一共三种可能:黑棋赢、白棋赢、不分胜负。其中某一种颜色的棋子在横线、竖线、或斜线方向超过5个子即为胜利
string如何转为char*(string::data()和string::c_str) string类对象转为char*string类是c++引入的,引入之后,大大方便了对字符串进行各种操作,但c语言的大多数函数不支持string类型的参数,因此string引入了这个函数用于将string类型的对象转换为char*例如:#include <iostream>#include <string>using namespace std;int main(){ string str; str = "1.txt"; FILE *file = fopen(
结构体知识进阶 文章目录结构体知识进阶位域存放函数指针动态结构体的使用结构体知识进阶总所周知,结构体是C语言中重要的数据类型,可以存放多种不同类型的数据结构体的一般用于存放类型不同但是又相互关联的数据,例如:一个人的身份信息包括姓名、性别、年龄和身份证号,这些数据需要由不同的数据类型存放,但是又都表示一个人的信息,这时一般会使用到结构体对该数据进行存储,但是结构体所能够支持的不止如此接下来,我将介绍几种开发中常用的结构体的高级操作位域我们都知道,C语言中不包含bool类型,需要表示true或false时一般使用
Qt使用QPainter在子控件上绘图 Qt使用QPainter在子控件上绘图因为Qt存在事件过滤机制,事件过滤器会将子控件上的绘图事件过滤,因此无法在子控件上使用QPainter进行绘图如果需要在子控件上使用QPainter,同样需要事件过滤器事件过滤器事件过滤器与其他部件不同,它不是一个类,只是由两个函数组成的一种操作用来完成一个部件对其他部件的事件监视,这两个函数分别是installEventFilter()和eventFilter(QObject *obj, QEvent *ev),都是QObject类中的函数使用步骤:安
设计模式课程设计 又到了一年两度的课程设计时间,又要开始写无聊的课程设计,学校是开了课程设计这门课的,但是疫情期间老师选的网课视频的讲解风格不是很好,所以我就自己在bilibili上看视频学习的,具体学习笔记可以看我的《设计模式》专栏
Linux下线程里面可以再创建线程吗?是的,可以 Linux下线程里面可以再创建线程吗经过操作系统的学习,我们知道线程是系统调用的最小单位,不是资源分配的最小单位,那么,线程里面可以创建新的线程吗?因为我在项目中使用线程再创建线程出现了问题,因此产生这个疑惑,但是网上一搜全是模棱两可的说法,因此亲自尝试,发现是可以创建的
Ubuntu能进入登录界面,但是登录进入桌面蓝屏/花屏 今天打开Ubuntu登录之后,进入桌面蓝屏,重启客户机之后蓝屏变成了花屏,搜索尝试后解决了这个问题,遂记录备忘可能原因:昨天关闭电脑的时候是强行关机
在Qt中查看.raw文件 在Qt中查看.raw文件Qt中图像类为QImage,而OpenCV对图像操作使用Mat/IplImage,因此,想要在Qt的控件上查看.raw文件需要先将IplImage/Mat转换为QImage推荐链接:IplImage与QImage之间相互转换的问题笔者就是参考这个链接,稍加改动,将.raw文件显示到了QLabel中代码如下:void MainWindow::showImage(){ //文件路径必须这样写,否则会报错 char *rawFileName = "D://QT/
在QT中使用OpenCV(简单测试例程) 在QT中使用OpenCV(简单测试例程)在使用OpenCV之前,需要先对其编译,编译教程在上一个文章中:编译OpenCV遇到的问题,含编译教程推荐将OpenCV编译安装之后,将会在CMake的目的目录生成相关文件:lib、bin在目的目录(CMake中填写的目的目录),install文件夹下可以找到include文件夹,建议将三者放到一起本人将生成的目录放置路径如下:D:\QT\Source\SourceFile\lib之后创建一个Qt项目,在.pro文件中添加如下语句INCLUDEPATH +=
使用MinGW、CMake编译OpenCV遇到的问题 使用MinGW、CMake编译OpenCV遇到的问题OpenCV环境搭建首先,需要下载OpenCV的安装文件,官方下载链接如下:https://opencv.org/releases/由于官网下载速度感人,因此将百度网盘链接分享出来OpenCV4.0.1提取码:3avb具体安装方式就不再赘述,参照网上的安装教程即可推荐教程一推荐教程二出现的问题:错误提示:CMake Error in modules/highgui/CMakeLists.txt: No known features fo
行为型模式---- 观察者模式(C++) 文章目录行为型模式---- 观察者模式模式的结构和实现模式的结构观察者模式UML类图观察者模式实例行为型模式---- 观察者模式观察者模式中多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新模式的结构和实现模式的结构抽象主题:提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法具体主题:实现抽象目标中的通知方法,当具体主题的内部状态发生变化时,通知所有注册过的观察者对象抽象观察者:抽象类或接口,它包含
行为型模式----命令模式(C++) 文章目录行为型模式----命令模式结构与实现模式的结构命令模式的UML类图命令模式特点优点缺点命令模式实例行为型模式----命令模式将一个请求封装为一个对象,使发出请求的责任与执行请求的责任分割开,也就是说,将命令的请求者和命令执行者两者之间实现“松耦合”,方便对行为进行“记录、撤销”等操作结构与实现模式的结构抽象命令:声明执行命令的接口,拥有执行命令的抽象方法具体命令:是抽象命令的具体实现类,它拥有接受者对象,并通过调用接收者的功能来完成命令要执行的操作调用者:是请求的发送者,它通常拥有多
行为型模式----策略模式(C++) 文章目录行为型模式----策略模式结构和实现模式的结构策略模式的UML类图模式的特点优点缺点策略模式实例行为型模式----策略模式策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户结构和实现模式的结构抽象策略类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法具体策略类:实现了抽象策略定义的接口,提供具体的算法实现环境类:持有一个策略类的引用,最终给客户端调用策略模式的UML类图模式的特
行为型模式----模板方法模式(C++) 文章目录行为型模式----模板方法模式结构和实现模式的结构模板方法模式UML类图模式特点优点缺点模板方法实例行为型模式----模板方法模式定义一个操作的算法骨架,将具体操作延伸到子类中,使得子类不改变算法结构的情况下重定义算法的某些特定步骤例如:去饭店吃饭的步骤一般有三个流程:点菜、吃饭、付款。其中点菜和付款的操作的具体步骤不明朗,需要在具体的子类中对其实现结构和实现模式的结构抽象类:负责给出算法的轮廓和骨架模板方法:定义了算法的骨架,按某种顺序调用包含的基本方法基本方法:是整个算法中的
结构型模式----适配器模式(C++) 文章目录结构型模式----适配器模式模式结构和特点模式结构模式优点模式缺点适配器模式的UML类图适配器模式实例结构型模式----适配器模式将一个类的接口转换为客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类能够一起工作模式结构和特点模式结构适配器模式的主要角色如下目标接口:当前系统业务所期待的接口,它可以是抽象类或接口适配者类:它是被访问和适配的现存组件库中的组件接口适配器类,它是一个转换器,通过继承或引用适配器对象,把适配器接口切换成目标接口,让客户按目标接口的格式访问适配
结构型模式----外观模式(C++) 文章目录设计模式----外观模式模式结构与实现模式的结构外观模式UML类图优点缺点外观模式的应用场景外观模式实例设计模式----外观模式外观模式为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问模式结构与实现模式的结构外观角色:为多个子系统对外提供了一个共同的接口子系统角色:实现系统的部分功能,客户可以通过外观角色访问其资源客户角色:通过一个外观角色访问子系统的功能外观模式UML类图优点降低了子系统和客户端的耦合度对用户屏蔽了子系统组件缺点不能很好的限制
结构型模式----装饰模式(C++) 文章目录设计模式----装饰模式实现和结构模式结构装饰模式的UML类图模式使用场景模式特点优点缺点装饰模式实例设计模式----装饰模式装饰模式:在不改变现有对象结构的情况下,动态的给对象增加一些额外功能实现和结构模式结构抽象构件:给出一个抽象接口,以规范准备接受附加责任的对象具体构件:实现抽象构件,通过装饰角色为其添加新的功能抽象装饰:继承抽象构件,并包含具体构件的实例,可以通过其扩展具体构件的功能具体装饰:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任装饰模式的UML类图
结构型模式----代理模式(C++) 文章目录设计模式----代理模式实现和结构模式组成模式特性优点缺点代理模式UML类图代理模式实例设计模式----代理模式代理模式为其它对象提供了一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用实现和结构代理模式通过定义一个抽象主题的代理来包含真是主题,从而实现真实主题的访问模式组成抽象角色:通过接口或抽象类声明真实角色实现的业务方法代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法
C++设计模式 文章目录C++设计模式重新认识面向对象面向对象原则设计模式分类方法C++设计模式重新认识面向对象从宏观层面看,面向对象的构建方式更能适应软件的变化,能将变化带来的影响降到最小从微观层面看,面向对象的方式更强调各个类的“责任”,由需求变化导致的新增类型不应该影响到原来类型对象的含义从语言实现层面看,对象封装了代码和数据从规格层面看,对象是一系列可被使用的公共接口从概念层面看,对象是拥有某种责任的抽象面向对象原则依赖倒置原则高层模块不应该依赖于底层模块,抽象不应该依赖于细节实
创建型模式----单例模式(C++) 文章目录设计模式----单例模式实现原理实现单例模式的步骤”饿汉式“和“懒汉式”单例模式实例设计模式----单例模式单例模式指一个类只有一个实例,且该类能自行创建这个实例的一种模式;例如:windows中只能有一个任务管理器实现原理通常情况下,普通类的构造函数是公有的,外部类可以通过"new 构造函数()"来生成多个实例,但是实现单例模式却需要不同的操作方法实现单例模式的步骤构造函数私有化增加静态私有的当前类的指针变量提供静态对外接口,让用户获得单例对象”饿汉式“和“懒汉式”饿汉
创建型模式----抽象工厂模式(C++) 文章目录设计模式----抽象工厂模式实现原理角色组成抽象工厂模式UML类图抽象工厂实例设计模式----抽象工厂模式抽象工厂模式用于产品族的构建,是所有形态的工厂模式中最为抽象和最具一般性的模式抽象工厂模式是一种为访问类提供一个创建一组或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可以生产多个等级的产品实现原理抽象工厂模式是针对产品族的,而不是像工厂方法模式针对一个产品等级角色组成和工厂方法
创建型模式----工厂方法模式(C++) 文章目录设计模式----工厂方法模式实现方式角色结构特性优点缺点工厂方法模式UML类图工厂方法模式实例设计模式----工厂方法模式工厂方法模式的核心是封装类中变化的部分,提取其中善变的部分为独立类,通过依赖注入以达到解耦、复用和方便拓展的目的工厂方法模式可以解决简单工厂模式的后期拓展问题,不违反“开闭原则”实现方式工厂方法模式对简单工厂模式进行了抽象,将工厂(Factory)类抽象化,这...
设计模式----简单工厂模式(C++) 文章目录设计模式----简单工厂模式实现方式特性优点缺点简单工厂模式实例设计模式----简单工厂模式简单工厂模式属于创建型模式,又叫静态工厂方法模式,但不属于23种GOF模式之一简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,它是工厂模式种最简单实用的模式实现方式简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪种产品类的实例简单工厂模式所包含的角色和职责如下...
使用StarUML使用类图的实现关系箭头提示Invalid connection (Interface Realization) 在使用StarUML绘制类图时,当需要绘制之间为实现关系时,总是无法绘制,受到Invalid connection (Interface Realization)的提示但是其它的连接关系都能正常使用,唯独它无法使用,让人很是不能理解出现这样的问题,首先需要从自身寻找原因,这么好的软件,肯定是自己不会用(狗头)废话不多说,直接上解决方案如果需要绘制该连线,需要在切换选项卡为Compos...
记录我的第一次面试(C++实习生) 记录我的第一次面试(C++实习生)前两天在BOSS直聘上上传了自己的简历,投递的方向是C++实习生,一天就接到了HR的消息,让我准备一下初面。虽然知道自己有很多的不足,也知道自己大概率会失败,但是我还是想积累一些经验,于是就准备了一下视频面试,面试开始之后,我打开了手机录音,希望可以在面试之后清楚的整理面试官的问题先跟大家介绍一下我被问到的问题吧,这些问题难度不大,网上也能轻易找到,就直接贴这...
简单的社区管理系统(Qt) 文章目录社区管理系统数据查看界面温度管理界面物资配送界面总结社区管理系统开发环境: Qt5,windows10,MySQL5.7系统简介: 该系统用于完成《智能硬件编程作业》,结合此次疫情写一个项目,并将其移植到硬件平台于是设计了这个包含物资配送和体温管理的社区管理系统该系统设计到的主要技术:该系统包含多个界面,使用TableView展示数据库中的数据,且可以更改图表,更新到数据库系统...
GitHub学习笔记(一) 本笔记是参照bilibili上的教学视频记录的,系列视频教程链接如下:https://www.bilibili.com/video/BV1pW411A7a5?p=1希望需要学习的可以去仔细学习一下!!!
串口通信 串口通信串行接口简称串口,也称为串行通信接口或串行通讯接口(COM接口),是采用串行通信方式的拓展接口。串行接口是指数据一位一位的顺序传送。其特点是通信简单,只要一对数据线就可以实现双向通信,从而大大降低了成本,特别适合远距离通信,但传送速度较慢常见接口类型RS-232:也称标准接口,是最常用的一种串行通讯接口,传统的标准接口有22根线,现简化为9根,采用单向传输,其传送距离最大为15米,...
在Linux-C中使用read函数返回值为0的问题 今天在使用read函数读取文件内容时,发现读取到的内容为空,就查看了read函数的返回值,发现返回值为0,原来是忘记在写入文件之后使用lseek函数调整文件位置.....
自定义vim vim是Linux中最常用的文本编辑器之一,因为其简单且大多数系统自带,所以被大多数人使用,但是没有经过配置的vim实在是难受由于我经常需要使用vim,并且总是需要在vim刚开始安装的时候对其进行配置,于是想记录备忘,详细配置方法如下:vim通过vimrc文件对其进行配置,vimrc文件的位置:系统 vimrc 文件: "$VIM/vimrc" 用 户 vimrc 文件: "$HO...
使用bootcamp给Mackbook Air装windows7遇到的一些问题 前两天帮别人电脑安装系统,他的苹果笔记本安装的双系统,其中windows7系统黑屏,看到是苹果笔记本时就凉了半截,苹果系统是出了名的麻烦,装了两天,还是没解决问题,但是想把这两天踩的坑给大家分享一下,避免大家继续踩坑
C++创建类的对象的两种方法 创建类现有一个学生类Student,它的定义如下:class Student{ private: char *name; int age; float score;};常见的C++创建类的对象的两种方法如下:第一种:Student stu;stu.name = “xiaoming”;stu.age = 20;stu.score = 9...
Qt入门书籍推荐 《Qt 5.9 c++ 开发指南》 Qt入门的书籍有很多,本人使用的是《Qt 5.9 c++ 开发指南》一书,如果同学们家境殷实,还是希望大家多多支持正版;但是如果大家像我一样家境贫寒,可以在此获得该书的电子版以及相关配套资源,此资料仅用于个人学习,请勿商用如果此博客侵犯了相关人员的版权,请联系本人删除,谢谢
Qt在工程中添加资源文件 在创建一个Qt项目时,我们经常使用到一些图标文件,这时就需要在项目中添加资源文件当然,在使用项目文件时使用本地文件也是可以的(不太推荐)接下来,我就将添加资源文件的步骤记录备忘第一步,新建资源文件在Qt Creator中点击"File-->New File or Project-->Qt-->Qt Resource File"之后选择Choose.....
Qt中Qt Charts的使用 在使用Qt Charts模块之前,你需要确认在安装Qt时的组件选择中,你勾选了Qt Charts这个组件要想使用该模块,必须在.pro文件中添加下面的语句QT += charts在确认.pro文件中添加了相应语句并保存之后,需要在程序头文件中添加#include <QtCharts>QT_CHARTS_USE_NAMESPACE或者#incl...
Windows下使用pip安装软件速度极慢如何解决? 在Ubuntu下使用pip速度过慢可以使用更改国内源的方法解决问题,但是在Windows下该如何解决pip速度过慢呢?本人在使用pip安装opencv时,速度极慢(6~7kb/s),让人十分无语,于是开始寻找解决方法:http://www.mamicode.com/info-detail-2248277.html参照这个文章解决了这个问题,在此记录一下1.国内源列表清华:http...
嵌入式开发Ubuntu开发环境的配置 超级用户登录在嵌入式开发中,经常需要使用root权限,因此进行超级用户登录设置以普通用户进入终端,在终端输入:sudo passwd root(需要输入root密码验证,且密码不回显)然后通过sudo vi /etc/lightdm/lightdm.conf修改/etc/lightdm.conf文件,在文件的末尾添加以下两行代码:greeter-show-manual-log...
PyCharm连接MySQL 在PyCharm的右侧,有一个Database工具栏如果没有此工具栏,请点击软件上方的view按钮,分别选择如下所示的选项,即可打开Database工具打开工具,点击右上角的"+"号,创建连接选中MySQ之后,会弹出界面提示用户输入相关参数如果是本地连接,host填写localhost即可如果是远程连接,host填写目的IP地址输入User和passwd(数...
计算机中小数的存储 我们在最初学习C语言的时候,学习数据类型的时候接触到了浮点数,知道了它被用来存储小数,但是为什么在计算机中小数要称为浮点数呢?在C语言中文网上,我知道了数据的存储分为定点数和浮点数,它们的命名方式也取决于它们存储数据的方式C语言小数存储的方法有两种:定点数和浮点数定点数 顾名思义,定点数就是小数点位置固定的数 下图以32bit机器为例,表示124.2...
二进制存储数据范围问题 在刚接触C语言时,书上说byte型为有符号8位整数,占1个字节,取值范围在-128~127int为有符号32位整数,占四个字节,取值范围是-2147483648~2147483647......当时只想记住范围,没有想过存储原理,只知道书上记载因为一个字节中,第一个二进制数为符号位(0为正号,1为负号),因此byte的数据范围最大值为2^7 - 1 = 127仔细想想,虽然明白正数被占...
C语言编译执行过程 一、C语言的编译执行过程我们在C语言编辑的文件是以.c为文件拓展名的,称为源文件;C语言编译器的功能就是将源文件,经过编译、链接之后可以形成可执行文件那么具体的步骤是什么呢?C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件二、编译执行过程详解第一步:在编辑器中编辑源文件第...
计算机三级考试笔记--------嵌入式 2019年9月参见的嵌入式三级考试,考试复习是利用未来教育的模拟题库进行复习的刚开始复习的时候,还是有许多的知识盲点,经常在相同的知识点犯错,但是慢慢的发现,这些知识点是有关联的,因此将知识点加以整理,并成功通过了考试。现在将知识点放到这里,希望能够帮助大家!!!
使用Keil4创建一个新的工程,遇到错误提示FirstProject.sct(7): error: L6235E: More than one section matches selector - c 如何新建项目一、安装固件库新建文件夹以保存安装的固件库; 新建子文件夹:CMSIS、Lib、Startup、User 将下载好的固件库文件解压之后,在以下路径中将*.c和*.h文件复制到CMSIS文件夹中:STM32F10x_StdPeriph_Lib_V3.5.0固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSu...
Qt如何使用自带的windeployqt打包程序(绿色软件,安装包) winde编写程序生成.exe文件之后,如果想要使其发布时,需要复制大量的.dll文件,且十分容易复制错误或缺少特定文件为了方便此操作,Qt自带了一个打包程序windeployqt来打包这些文件一、打包绿色软件具体的步骤如下:1、生成可执行文件.exe打开Qt中的工程,在右下角选择目标文件的类型(如果是要发布程序,需要选择release)接着在项目存放路径中找到buil...