C++
文章平均质量分 79
C++
AI浩
2022年博客之星Top8,2021年博客之星Top6,博客专家,华为云云享专家,十佳博主,阿里云专家博主,拥有多项发明专利并参与过国家重大专项,拥有丰富的开发经验。注重理论与实践的结合,让AI学起来不再枯燥。如果大家在看文章的时候,发现了文章的错误,烦请指出,我会及时纠正。
展开
-
cv::mat与unsigned char*相互转化之间的转换
#include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>#include "opencv2/imgproc.hpp"#include "opencv2/imgcodecs.hpp"using namespace cv;//nBandNum表示图像buffer是几通道的,例如四通道的rgba,三通道的rgb;//nBPB表示图像的位深是.原创 2022-05-21 21:41:48 · 3727 阅读 · 4 评论 -
无法解析的外部符号 _WinMain@16
项目是动态库dll,改为应用程序(.exe)后出现了“无法解析的外部符号 _WinMain@16”的错误,解决办法:(1)项目->属性->配置属性->C/C++ ->预处理器 中的【预处理器定义】 删除“_CONSOLE” 添加 “ _WINDOWS”(2)项目->属性->配置属性->连接器->系统中的【子系统】设置为 控制台 (/SUBSYSTEM:CONSOLE)或DEBUG选择x64(3)生成->重新生成解决方案...原创 2021-05-25 15:06:39 · 2307 阅读 · 1 评论 -
C++中new与malloc的区别
这是个老生常谈的问题。当时我回答new从自由存储区上分配内存,malloc从堆上分配内存;new/delete会调用构造函数/析构函数对对象进行初始化与销毁;operator new/delete可以进行重载;然后强行分析了一下自由存储区与堆的区别。回来后感觉这个问题其实回答得不怎么好,因为关于new与malloc的区别实际上很多。面试期间刚好是刚期末考完,之后是几个课设没时间去整理。今天花了点时间整理下这个问题。new与malloc的10点区别1. 申请的内存所在位置new操作符从自由存储区(原创 2021-04-29 11:11:53 · 1856 阅读 · 0 评论 -
11、QT基础——文件系统
文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图(Qt5):QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口; QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。 QFlie:访问本地文件或者嵌入资源; QTemporaryFile:创建和访问本地文件系统的临时文件; QBuf..原创 2021-04-16 13:37:22 · 620 阅读 · 0 评论 -
10、QT基础——绘图和绘图设备
10.1 QPainterQt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维空间允许QPainter在其上面进行绘制,也就是QPainter工作的空间;QPaintEngine提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。QPaintEngine类应用于QPainter和..原创 2021-04-16 13:35:45 · 916 阅读 · 0 评论 -
9、QT基础——Qt消息机制和事件
9.1 事件事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。在前面我们也曾经简单提到,Qt 程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt ...原创 2021-04-16 13:33:17 · 745 阅读 · 0 评论 -
8、QT基础——常用控件
Qt为我们应用程序界面开发提供的一系列的控件,下面我们介绍两种最常用一些控件,所有控件的使用方法我们都可以通过帮助文档获取。8.1 QLabel控件使用QLabel是我们最常用的控件之一,其功能很强大,我们可以用来显示文本,图片和动画等。显示文字 (普通文本、html)通过QLabel类的setText函数设置显示的内容:void setText(const QString &)可以显示普通文本字符串QLable *label = new QLable;...原创 2021-04-16 13:31:23 · 1343 阅读 · 0 评论 -
7、QI基础——布局管理器
所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。Qt 提供了两种组件定位机制:绝对定位和布局定位。绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗..原创 2021-04-16 13:29:06 · 360 阅读 · 0 评论 -
6、QT基础——对话框QDialog
6.1 基本概念对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt 中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog。QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框..原创 2021-04-16 13:27:07 · 9868 阅读 · 0 评论 -
5、 QT基础——QMainWindow
QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器等。5.1 菜单栏一个主窗口最多只有一个菜单栏。位于主窗口顶部、主窗口标题栏下面。创建菜单栏,通过QMainWindow类的menubar()函数获取主窗口菜单栏指针QMenuBar *...原创 2021-04-16 13:25:37 · 512 阅读 · 0 评论 -
4、QT基础——信号和槽机制
信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。4.1 系统自带的信号和槽下面我们完成一个原创 2021-04-16 10:20:07 · 389 阅读 · 0 评论 -
3、 QT基础——第一个Qt小程序
3.1 按钮的创建在Qt程序中,最常用的控件之一就是按钮了,首先我们来看下如何创建一个按钮QPushButton * btn = new QPushButton; 头文件 #include <QPushButton> //设置父亲 btn->setParent(this); //设置文字 btn->setText("德玛西亚"); //移动位置 btn->move(100,100);...原创 2021-04-16 10:02:46 · 449 阅读 · 0 评论 -
2、QT基础——创建Qt项目
2.1 使用向导创建打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项弹出New Project对话框,选择Qt Widgets Application,选择【Choose】按钮,弹出如下对话框设置项目名称和路径,按照向导进行下一步,选择编译套件向导会默认添加一个继承自CMainWindow的类,可以在此修改类的名字和基类。默认的基类有QMainWindow、QWidget以及QDialog三个,我们可以选原创 2021-04-16 09:57:53 · 1214 阅读 · 0 评论 -
1、QT基础——Qt概述
1.1 什么是QtQt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。1.2 Qt的发展史1991年 Qt最早由奇趣科技开发1996年 进入商业领域,它也是目前流行的Linux桌面环境KDE的基础2008年 奇趣科技被诺基亚公司收购,Qt称为诺基亚旗下的编程语言2012年 Qt又被Digia公司收购2014年4月 跨平台的集成开发环境Qt Creator3.1.0发布,同原创 2021-04-16 09:53:37 · 534 阅读 · 0 评论 -
函数指针做函数参数 使用总结及其意义
1、函数指针函数指针用于指向一个函数函数名是函数体的入口地址1)可通过函数类型定义函数指针: FuncType* pointer;2)也可以直接定义:type (*pointer)(parameter list);pointer为函数指针变量名type为指向函数的返回值类型parameter list为指向函数的参数类型列表例:#include <windows.h>#include <stdio.h>#include <iostre原创 2020-12-12 16:59:49 · 8021 阅读 · 0 评论 -
编译器堆空间不足
打开.vcxproj文件,在文件中找到这个节点<PropertyGroup Label="Globals">, 然后在这个节点的最后加一句<PreferredToolArchitecture>x64</PreferredToolArchitecture>,这样就可以的解决编译器堆空间不足问题...原创 2020-11-02 13:12:54 · 2657 阅读 · 0 评论 -
C++ 类型转换
1、类型转换介绍C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。 1、 static_cast<>() 静态类型转换,编译的时c++编译器会做类型检查;基本类型能转换 但是不能转换指针类型2、reinterpreter_cast 重新解释类型,若不同类型之间进行强制类型转换,则用reinterpret_cast<&...原创 2020-10-17 11:13:51 · 593 阅读 · 0 评论 -
函数模板做函数参数
#include <iostream>using namespace std;template<typename T, typename T2>void sortArray(T *a, T2 num){ T tmp ; int i, j ; for (i=0; i<num; i++) { for (j=i+1; j<num; j++) { if (a[i] < a[j]) { tmp = a[i]; a[i] .原创 2020-10-17 09:56:53 · 644 阅读 · 0 评论 -
Win10 Parse error at “IID“
出现这个错误是因为升级了Qt VS Tools,我的版本是2.6,出现了这个问题,把它降到2.3.2版本以后可以解决的这个问题。原创 2020-10-10 10:53:52 · 1178 阅读 · 0 评论 -
LNK 1104 无法打开文件“XXX.lib”
出现这样的问题,需要检查工程的输出文件路径是否正确。右键“属性-》链接器-》常规-》输出文件”,将其修改,如图所示:原创 2020-10-09 17:06:15 · 1240 阅读 · 0 评论 -
C++ 函数模板
定义函数模板是一种特殊的函数,可以使用不同的类型进行调用,对于功能相同的函数,不需要重复编写代码,并且函数模板与普通函数看起来很类似,区别就是类型可以被参数化函数模板定义形式 template < 类型形式参数表 > 类型形式参数的形式为: typename T1 , typename T2 , …… , typename Tn或 class T1 , class T2 , …… , class Tn ...原创 2020-10-09 12:39:46 · 376 阅读 · 0 评论 -
模板函数和普通函数重载时的调用规则
在模板函数和普通函数重载时,C++编译器对函数的调用规则如下:当函数模板和普通函数都符合调用时,优先选择普通函数。如果想显示使用函数模板,则使用<>类型列表。 如果函数模板能产生更好的匹配,则使用函数模板。 函数模板不允许自动类型转化,普通函数能够进行制动类型转换。规则一使用举例:#include <iostream>using namespace std;int Max(int a, int b){ cout << "int M...原创 2020-10-09 11:20:17 · 1141 阅读 · 0 评论 -
利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦 第二种方式
新建空项目,命名为RF_Drive,这个作为底层的驱动。添加MyDrive.c文件,向文件中添加代码,模拟驱动一些函数,代码如下:思路:EncData和DecData实现信息的加密和解密,由于不同厂家的设备,加密和解密的方式不同,所以不能在底层驱动中实现,需要不同的厂家在自己的函数库中实现。厂家和驱动约定好相同的接口,将函数通过指针通过调用socketclient_SetEncDataCallback函数,提前将函数存放到Sck_Handle里面。#define _CRT_SE...原创 2020-09-29 17:04:44 · 686 阅读 · 0 评论 -
利用函数指针实现C的回调函数,实现调用者和底层驱动的解耦
新建空项目,命名为RF_Drive,这个作为底层的驱动。添加MyDrive.c文件,向文件中添加代码,模拟驱动一些函数,代码如下:思路:EncData和DecData实现信息的加密和解密,由于不同厂家的设备,加密和解密的方式不同,所以不能在底层驱动中实现,需要不同的厂家在自己的函数库中实现。厂家和驱动约定好相同的接口,将函数通过指针传进来,实现函数的回调。#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#incl..原创 2020-09-29 16:21:39 · 607 阅读 · 0 评论 -
C++ 调用C封装DLL的两种方式(静态调用和动态调用)
编写DLL代码新建工程新建空项目工程点击确定。然后右键项目选择新建项。出现下图,选择头文件。再次选择新建项,选中C++文件,将其改为MySocketClient.c,然后选择添加。到这里,新建工程就完成了。然后右键项目,选择属性 将配置类型改为动态库(.dll)编写头文件MySocketClient.h#ifndef _INC_MYSOCKETCLIENT_H_#define _INC_MYSOCKETCLIENT_H_#define Im原创 2020-09-11 15:09:24 · 1710 阅读 · 0 评论 -
C++ 静态调用C的DLL库(调用lib文件)
编写DLL代码新建工程新建空项目工程点击确定。然后右键项目选择新建项。再次选择新建项,选中C++文件,将其改为MySocketClient.c,然后选择添加。到这里,新建工程就完成了。然后右键项目,选择属性 将配置类型改为动态库(.dll)编写头文件MySocketClient.h#ifndef _INC_MYSOCKETCLIENT_H_#define _INC_MYSOCKETCLIENT_H_#define Import_SSS..原创 2020-09-11 15:02:23 · 1202 阅读 · 0 评论 -
_declspec(dllexport)和_declspec(dllimport)
含义:__declspec(dllexport)导出到dll__declspec(dllimport)从dll导入解决的问题: 考虑下面的需求,使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件。头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。举例:#ifndef _INC_MYSOCKETCLIENT_H_#define _INC_MYSOCK.原创 2020-09-10 11:10:46 · 577 阅读 · 0 评论 -
C++通过LoadLibrary的方式调用C封装的dll
编写DLL代码新建工程新建空项目工程点击确定。然后右键项目选择新建项。再次选择新建项,选中C++文件,将其改为MySocketClient.c,然后选择添加。到这里,新建工程就完成了。然后右键项目,选择属性 将配置类型改为动态库(.dll)编写头文件MySocketClient.h#ifndef _INC_MYSOCKETCLIENT_H_#define _INC_MYSOCKETCLIENT_H_#define Import_S...原创 2020-09-10 10:54:05 · 4731 阅读 · 0 评论 -
#ifdef _cplusplus extern “C“ 含义及应用
#ifdef _cplusplus:编译器如果是C++ extern"C" 来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。他们经常出现在.h文件中。例:#ifndef _INC_MYSOCKETCLIENT_H_#define _INC_MYSOCKETCLIENT_H_//#define Import_SSS#ifdef Import_SSS#define API _declspec(dllexport)#else #define API _declsp..原创 2020-09-10 09:54:45 · 572 阅读 · 0 评论 -
Visual Studio 2017 选中一段英文改为大写或小写
改成小写:Ctrl+U改成大写:Ctrl+Shift+U原创 2020-09-09 20:00:49 · 1270 阅读 · 0 评论 -
C++ 事件(event)使用总结
事件最常用在多线程同步互斥机制。常用的函数有:1、CreateEvent 创建事件。函数原型如下所示,一共四个参数:HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可为NULL BOOL bManualReset, // 手动/自动 // TRUE:表示手动,在WaitF...原创 2020-09-03 13:29:13 · 15254 阅读 · 0 评论 -
错误:Error:未定义标识符“_TCHAR“
添加一条 #include <tchar.h> 即可成功编译原创 2020-09-03 12:04:13 · 744 阅读 · 0 评论 -
C++ 操作DLL的函数 Loadlibrary GetProcAddress FreeLibrary
LoadLibrary("文件名"):返回得到的模块句柄,可以加载一个动态连接库或exe文件。例: HINSTANCE hLib = NULL; string path = g_strExeFilePath + "\\xx.dll"; LPCSTR strPath = path.c_str(); hLib = LoadLibrary(strPath); if (hLib == NULL) { printf("LoadLibraryA()失败! ...原创 2020-09-02 10:03:33 · 7037 阅读 · 0 评论 -
C++ 在函数中使用静态局部变量,让函数返回数组
C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:int * myFunction() { . . . }另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为static变量。例如:#include <iostream>using namespace std;int a[10] = { 10,20 };char *GetCha..原创 2020-08-25 08:23:43 · 1082 阅读 · 0 评论 -
C++ 用引用的方式向函数传递数组
#include <iostream>using namespace std;int a[10] = { 10,20 };void GetCharArr(char (&ac)[20]){ sprintf_s(ac, "ABABXX%d", a[0]);}int main(){ char str1[20]; GetCharArr(str1); printf("当前的字符串是:%s", str1); system("...原创 2020-08-25 08:09:06 · 1968 阅读 · 0 评论 -
错误 不存在从 “std::string“ 到 “LPCSTR“ 的适当转换函数
遇到这样的问题需要将std:string类型转为LPCSTR类型。标准库的std::string转换成LPCSTR很简单:直接调用c_str()即可。例:std::string a="abc"; LPCSTR str = a.c_str();还有一种情况时原创 2020-08-19 10:21:17 · 5099 阅读 · 0 评论 -
C++ 返回字符数组的写法
#include <iostream>using namespace std;char w[20];int a[10] = {10,20};char *GetCharArr(){ char sss[20] = {0}; sprintf_s(sss, "ABABXX%d", a[0]); cout << sss << endl; return sss;}int main(){ char *xxx; xx...原创 2020-08-18 21:31:44 · 4202 阅读 · 0 评论 -
error C2375: “WSACleanup”: 重定义 C2011 “sockaddr_in”:“struct”类型重定义
在#include <Windows.h>前添加宏定义#define WIN32_LEAN_AND_MEAN原创 2020-08-18 14:40:14 · 1963 阅读 · 0 评论 -
C++网络通信 Socket
服务端:#include <iostream>#include <thread>#include <winsock2.h>#pragma comment(lib, "ws2_32.lib")using namespace std;int main() { //不用管这两行,抄就完事了 WSADATA ws; WSAStartup(MAKEWORD(2, 2), &ws); /* ...原创 2020-08-17 19:41:24 · 1651 阅读 · 0 评论 -
错误 C4996 ‘inet_ntoa‘: Use inet_ntop() or InetNtop() instead or define _WINS
严重性 代码 说明 项目 文件 行 禁止显示状态错误 C4996 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings Server c:\users\wh\desktop\server\server\server.cpp 55 解决...原创 2020-08-17 18:59:15 · 11647 阅读 · 1 评论