- 博客(106)
- 收藏
- 关注
原创 C++简明教程(15)在VS中使用添加多项目
引用可以理解为项目依赖,就是新建的项目依赖于Dll1项目,在重新生成刚刚新建的项目时,Dll1项目也会重新生成,清理时也会清理依赖的项目。设置启动项目是指在VS中执行调试时启动哪个项目,假如有多个可执行程序时我们可以指定调试运行哪个程序。来为新项目配置Dll1项目。
2024-12-25 02:55:24
50
原创 C++简明教程(13)创建和配置dll与lib库
PDB 文件(Program Database File):它是在 Windows 平台上用于调试的文件,包含了程序的调试信息,例如变量名、函数名、行号、类型信息等。当在 Visual Studio 等开发环境中进行调试时,如果有对应的.pdb文件,调试器可以显示更详细准确的调试信息,如变量的当前值、函数的调用栈等,帮助开发者更容易地找出程序中的错误。如何使用:在 Visual Studio 中,默认情况下,当编译项目时,如果是调试模式(Debug 配置),会自动生成.pdb文件。
2024-12-25 02:52:15
163
原创 C++简明教程(11)(类的继承,虚函数)
定义虚函数在基类中,使用virtual关键字来声明虚函数。例如:public:子类覆盖虚函数子类可以覆盖基类中的虚函数,函数签名(函数名、参数列表、返回值类型)必须与基类中的虚函数完全相同。并且建议在子类中使用override关键字,这样如果不小心写错函数签名,编译器会给出错误提示。例如:public:通过指针或引用调用虚函数实现多态我们可以使用基类指针或引用指向子类对象,然后调用虚函数,这时就会根据对象的实际类型调用相应的函数。
2024-12-25 02:46:20
1016
原创 C++简明教程(10)(初识类)
类类似于结构体(struct),但功能更加强大。public: // 公有访问修饰符// 数据成员int age;void introduce() { // 成员函数类是一种封装机制,通过访问修饰符控制成员访问权限。构造函数和析构函数用于管理对象生命周期,特别是动态分配资源时。运算符重载使对象更具灵活性,但需要小心处理自我赋值。静态成员共享数据,对整个类有效。this指针是成员函数内部隐含的指针,指向当前对象。
2024-12-22 02:32:35
934
原创 C++简明教程(12)(编程命名规范)
命名规范是 C++ 编程中不可或缺的一部分,它不仅仅是一种代码编写的约定俗成,更是提高代码质量、促进团队协作以及提升开发效率的重要手段。通过遵循表意清晰准确、避免歧义、保持简洁性等通用原则,并在变量、函数、类、文件和常量等各个方面采用合适的具体命名规范,开发者能够编写出更加易于理解、维护和扩展的代码。同时,在团队开发环境中,严格执行统一的命名规范能够减少沟通成本,避免因命名不一致而引发的各种问题,从而使整个项目的开发过程更加顺利和高效。
2024-12-22 02:22:14
1010
原创 C++简明教程(9)(多文件编程)
通过将代码分多个文件编写,每个文件负责特定的功能模块,可以有效解决这些问题,使代码结构更加清晰、易于维护和阅读,同时也方便团队成员分工协作。添加新文件:移除旧文件。
2024-12-22 01:49:14
1074
原创 C++简明教程(8)(new/delete)
栈内存的特点是内存分配和释放的速度非常快,因为其操作是由编译器自动完成的,遵循“后进先出”(Last In First Out,LIFO)的原则。但是,栈内存的大小通常是有限的,在一些情况下,如果函数中定义了过多的局部变量或者递归调用层数过深,可能会导致栈溢出(Stack Overflow)的错误。堆内存堆内存是一块相对较大的内存区域,用于存储在程序运行过程中动态分配的内存。与栈内存不同,堆内存的分配和释放需要程序员手动使用特定的操作符(如 C++ 中的 和 ,C 语言中的 和 )来进行管理。
2024-12-22 00:42:44
1017
原创 C++简明教程(7)(引用)
引用是 C++ 中的一个重要特性,它可以看作是变量的别名。引用在创建时必须被初始化,这是引用的一个重要规则。因为引用本身不占用额外的内存空间,它只是已存在变量的别名,所以需要在声明时就指定它所引用的变量。例如:在上述代码中, 被声明为对 的引用,对 的任何操作都等同于对 的操作,因为它们本质上是同一个内存位置的不同名称。指针可以在程序运行过程中重新指向其他变量的内存地址,具有更大的灵活性,但同时也需要更多的内存来存储指针本身的地址信息。2. 操作符与语法:- 引用:在声明和使用引用时,使用
2024-12-22 00:03:51
1028
原创 C++简明教程(6)(进制、位数、字节数)
十进制是我们日常生活中最熟悉的计数系统,它使用 0 - 9 这十个数字来表示数值。每个数位的权重是 10 的幂次,从右到左依次递增。例如,数字 253 可以表示为:这里的42就是十进制数。
2024-12-21 23:51:17
542
原创 C++简明教程(4)(Hello World)
想象一下,在现实世界中,可能有两个不同的城市都有一个叫做“张庄”的地方,如果我们在地图上只写“张庄”,就很难区分到底是指哪个城市的“张庄”。就好像你在写一篇故事,故事里的角色要使用某个特定的工具,但这个工具不是这个角色自己拥有的,而是在一个专门存放工具的仓库(头文件)里被定义和描述的,所以我们需要先把这个“仓库”引入到故事中来(通过。通过这种方式,我们将自己定义的函数放在一个独立的命名空间中,避免了与其他可能存在的同名函数发生冲突,同时也展示了如何在代码中使用命名空间来组织和访问不同区域的代码元素。
2024-12-21 21:26:40
1079
原创 C++简明教程(3)(初识VS)
但如果我们以后要开发 GUI(Graphical User Interface,图形用户界面)应用程序,比如像我们平时使用的软件那样有漂亮的窗口、按钮等,我们可能就会选择 MFC 或者 QT 项目类型,这时候 VS 会在空项目的基础上配置更多的东西,就像给我们的“魔法盒子”添加更多更高级的“魔法道具”,让我们能够创造出更加丰富多彩的程序。我们可以创建一个专门的文件夹,然后把输出目录设置为这个文件夹的路径,这样我们就能很容易地找到编译好的文件,就像把宝藏都放在一个特定的仓库里,方便我们随时取用。
2024-12-21 03:38:46
513
原创 C++简明教程(2)(初识编译原理)
例如,源文件 A 调用了源文件 B 中定义的函数,在编译阶段 A 只是知道有这个函数可以调用(通过头文件声明),在链接阶段,链接器就会找到源文件 B 编译后的目标文件中那个函数的实现代码,把它们连接起来,使得整个程序成为一个完整的可执行文件,就像把不同章节的故事连贯地装订成一本书,让读者(计算机)能够从头读到尾,顺利执行程序的功能。:它像是故事的大纲或者人物介绍。这样,当其他源文件中用到这个函数时,编译器就知道这个函数的存在以及它的基本样子,即使还没看到函数具体是怎么实现加法运算的(也就是函数体)。
2024-12-21 02:57:56
988
原创 C++简明教程(1)(初入C++)
在编程语言的广阔天地里,C++ 占据着独特的位置,和 Python、Matlab 等脚本语言大不一样,它是编译型语言。
2024-12-21 01:57:47
837
原创 CMake 统一配置方式的优势
要是想生成适用于 MINGW 环境下的构建配置,同样可以通过相应的参数来指定,之后 CMake 就会按照 CMakeLists.txt 文件中的设定,生成对应的配置文件,后续就可以在相应 IDE 或者构建工具环境中顺利开展项目的编译、调试等工作了。CMake 的使用操作相对简单,开发者只需要在命令行中运行 CMake 命令,并通过指定相应的参数来选择所需的平台或构建工具,就能将 CMake 中定义好的配置转换为对应 IDE 可用的配置文件。为真),就将其头文件路径添加到包含路径中,然后把依赖该库的源文件。
2024-12-20 18:33:43
823
原创 C++ 使用vector 出现多次对象拷贝和析构
这是因为,vector在动态调整长度的时候会执行vector的拷贝,因此就执行了对象的拷贝和析构。
2024-11-19 11:50:47
181
原创 videocapture_gphoto2_autofocus自动聚焦opencv例程
【代码】videocapture_gphoto2_autofocus自动聚焦opencv例程。
2024-07-25 01:37:38
280
原创 解决window下Qt中文乱码
此流程:‘qt中的QFileDialog获取Qstring,然后把字符串显示在ui上’,不需要额外的类型转换就能支持中文。如果C++的三方库库中某个接口的输入要求是std::string类型,那么。文件编码:用记事本另存为utf-8带有bom。如果把std的文字显示在qt上。
2024-07-05 16:32:53
215
原创 基于梯度下降的多元线性回归原理
为了展示多元线性回归的迭代过程,我们可以使用梯度下降算法手动实现多元线性回归。梯度下降是一种迭代优化算法,用于最小化损失函数。1thetay_predtheta通过这种方法,我们能够清楚地看到迭代的过程以及每次迭代中回归系数的更新。让我们详细解释一下梯度的计算公式。在多元线性回归中,我们的目标是最小化损失函数,通常是均方误差(Mean Squared Error, MSE),它定义为:为了最小化这个损失函数,我们使用梯度下降法。
2024-06-14 15:07:36
471
原创 模板编程中实现 SFINAE(Substitution Failure Is Not An Error)
在C++模板编程中,是一个常用的工具,它依赖于 SFINAE(Substitution Failure Is Not An Error)原则来控制模板的启用或禁用。理解如何工作,可以更清楚地看到为什么在某些情况下等同于void类型。
2024-05-28 14:30:57
337
原创 Qt框架相关的可执行文件
Qt助手,用于浏览和搜索Qt文档的工具。: 处理控制区域网络(CAN)总线通信的实用工具。: Qt Designer,可视化的界面设计工具,用于创建Qt应用程序的用户界面。: 从Qt二进制元对象文件中转储C++信息的实用程序。: 生成各种格式文档的工具,用于文档生成。: Qt的集成开发环境(Integrated Development Environment)。: 用于转换和操作Qt Linguist翻译文件的实用程序。: 许可证检查器,用于检查Qt应用程序的许可证。
2024-01-07 15:35:41
705
2
原创 浅析如何从.vcproject 到最终的目标:MSBuild MSVC cl
在整个过程中,MSBuild负责协调和组织构建过程,而MSVC负责实际的编译和链接任务。这种分离允许开发者使用不同的构建引擎(MSBuild)来管理项目,而使用不同的编译器集合(如MSVC)来实际编译源代码。这也使得整个构建过程更加灵活,因为MSBuild可以用于各种类型的项目,而不仅仅是C++项目。这些组件一起构成了MSVC工具集,为开发者提供了完整的C++开发环境。Microsoft Visual C++ (MSVC) 包含了一整套开发工具和组件,用于支持C++开发,包括编译、链接、调试、性能分析等。
2024-01-07 02:36:32
1230
原创 使用cmake配置matplotlibcpp生成VS项目
matplotlibcpp的GitHub官方代码小修改,环境配置。使用cmake生成VS项目
2023-12-28 22:38:37
809
原创 前置声明避免循环依赖
在这个例子中,Toolnterface.h 和 QToolBase.h 头文件中使用了彼此的前置声明,而实际的类定义和实现则分别在 Toolnterface.cpp 和 QToolBase.cpp 文件中提供。在 main.cpp 中,我们创建了 QToolBase 和 Toolnterface 的实例,并通过 Set 方法建立了彼此之间的引用。当你有两个类互相引用的情况时,使用前置声明可以帮助你避免循环依赖。以下是一个简单的例子,其中包含两个头文件、两个源文件以及一个 main 函数的示例。
2023-11-23 00:25:37
192
原创 QT读取DLL加载算法
在应用程序中(PS软件),初始化时加载DLL,获取所有DLL的CreatTool函数,保存在map中。然后我使用工具时直接查询map的value,然后调用process函数,show函数,就能直接调用派生类的方法了。将工具打包成DLL,PenTool.dll,其中有一个概关键函数叫做CreatTool,返回类型为Tool* ,但是实际返回 new PenTool。第二种,新算法代码封装成库,然后调用库,增添少量代码,编译整个项目。第一种第二种就不说了,详细说下第三种。
2023-09-24 23:56:32
524
1
原创 CUDA图像处理加速demo
环境搭建和安装就不提了。主要步骤是申请显存,将内存复制到显存,执行核函数,将显存复制回内存。核函数是可以认为是线程的worker函数。
2023-09-20 02:03:07
394
原创 Intel IPP 和Opencv图像处理
简单介绍一下,IPP是一个intel提供高性能计算的平台,尤其针对intel芯片有特殊的优化。不仅包括图像处理,还有很多其他应用场景。官网教程实在是详细,不愧是intel。
2023-09-19 23:59:48
1584
原创 AI嵌入式全景:各厂商、系列和开发工具的综合概览
要看几个方面一般而言各个平台均采用linux操作系统,官方提供对应SDK,安装好后可使用硬件加速资源。
2023-08-22 02:07:28
670
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人