
C++
文章平均质量分 71
会会会飞的鱼
IT攻城狮
展开
-
Qt笔记 -- Qt对象类型QObject源码中间接层的设计思想
如果查看QObject类型定义,可以发现类型里面有很多成员函数,但是除了 d_ptr之外,就没有定义更多的成员变量。当然,没有定义更多成员变量并不等于QObject对象实例中就只有d_ptr这一个数据。现在让我们来讨论这么一个问题,QObject肯定是有内部状态数据的,那么内部状态数据保存在哪儿呢?......原创 2022-07-03 21:40:27 · 623 阅读 · 1 评论 -
COM编程(1)-- 为什么需要COM
1. COM基础COM是一种规范,COM是一种规范,而不是实现。当使用C++来实现时,COM组件就是一个C++类,而COM接口就是继承至IUnknown的纯虚类,COM组件就是实现相应COM接口的C++类。COM规范规定,任何组件或接口都必须从IUnknown接口中继承而来。IUnknown定义了3个重要函数,分别是QueryInterface、AddRef和Release。其中,QueryInterface负责组件对象上的接口查询,AddRef用于增加引用计数,Release用于减少引用计数原创 2021-11-07 21:48:56 · 652 阅读 · 0 评论 -
C++中的odr
// The main module. File: odr_test1.cpp #include <iostream>void module1_print(); // declaration of an exeternal functioninline int f1(){ return 4;}class A{public: static double f() { return 4.1; }};const double C = 4.2;constex.原创 2021-09-11 22:00:28 · 670 阅读 · 0 评论 -
深入C++对象模型(5) -- 成员初始化列表
一、什么是初始化列表?C++类的成员变量初始化有两种途径,第一种是在类的constructor函数本体内,另一种途径就是经由初始化列表(initialization list)。如:在构造函数体内初始化:class Person{public: Person() { name = 0; age = 0; }private: String name; int age;};使用初始化列表初始化:class P...原创 2021-09-11 20:31:28 · 859 阅读 · 0 评论 -
深入C++对象模型(1) -- C++的三种模型
从本篇博客开始,根据《深入C++对象模型》这本书,加上自己的理解,探讨C++的对象模型以及相关的问题。博客尽量使用书中的名词、图例和例程。C++是面向对象的语言,类是C++与C的区别。在C++中,有两种class data members:static和nonstatic,以及三种class member function:static、nonstatic和virtual。已知有下面这个class Point声明:class Point{public: Point(float x); v.原创 2021-09-11 18:35:07 · 1017 阅读 · 0 评论 -
XML解析之SAX方式
XML解析之SAX方式解析xml文件SAX解析方式会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,采用事件处理的方式解析XML (Simple API for XML) ,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。优点是:在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷。不需要加载进内存,因此不存在占用内存的问题,可以解析超大XML。缺点是:只能用来读取XML中数据,无法进行增删改。SAX解析可分四个步骤进行:1、得到xml文原创 2021-09-05 20:23:01 · 2576 阅读 · 1 评论 -
Window系统下开发Qt(9)-- MOC文件的两种生成方式
这是因为在此程序中使用了Q_OBJECT宏,这个宏是Qt对C++的扩展。需要要先使用Qt提供的moc程序生成moc文件,然后再用C++编译器编译此文件,才能正常链接。一种方式是在VS中设置自定义生成工具来生成moc文件。设置自定义生成工具,就是指定生成工具的路径和命令参数,以及输出文件。在VS编译前会先调用自定义生成工具来生成相关代码。命令行:$(QT5_DIR)\bin\moc.exe %(Filename).h -o moc_%(Filename).cpp输出:moc...原创 2021-09-04 20:08:47 · 3784 阅读 · 0 评论 -
COM编程(2)-- 第一个COM组件
实现一个COM组件,需要完成以下工作:COM组件接口 COM组件实现类 COM组件创建工厂 COM组件注册与反注册本文以一个例子作为说明,COM组件实现了一个矩形类,提供了两个接口,IAbstructShape和IDisplay。IAbstructShape接口提供了shapeType接口函数,返回矩形类的类型。IDisplay接口提供了draw接口函数,将在屏幕上绘制出矩形。一、COM组件的实现代码目录结构如下||--include |--IAbstructShape....原创 2021-09-04 14:00:49 · 1294 阅读 · 0 评论 -
Win32笔记(2)-- 捕获DUMP
#include "Windows.h"#include "DbgHelp.h"int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers){ // 定义函数指针 typedef BOOL(WINAPI * MiniDumpWriteDumpT)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_U.转载 2021-08-24 11:13:41 · 340 阅读 · 0 评论 -
Window系统下开发Qt(6)-- Qt默认连接槽和信号
一般的,将槽函数和信号连接在一起,要使用connect函数,例如:MyWindow::MyWindow(){ m_ui = new Ui::MyWindowUI(); m_ui->setupUi(this); connect(m_ui->btnShowMsg, SIGNAL(clicked()), this, SLOT(onClicked()));}MyWindow::~MyWindow(){}void MyWindow::onClicked(){ QMessa原创 2021-08-22 17:30:53 · 531 阅读 · 0 评论 -
CMake中使用vcpkg
vcpkg是一个微软开源的C++包管理器。在以前的开发中,如果在项目中需要使用某个开源库,例如qt,我们需要取官网下载qt的源码,然后构建得到对应的库,然后在项目中链接这个库。对于自己熟悉的库还好说,若是不熟悉的库,如何拉取源码?如何构建?如何在项目中引用?等等这些问题通常会困扰我们,然而,大多数情况下,我们只是使用这个开源库,并不需要关心这个库的构建和编译等问题。如此,在以前的开发过程中,往往会花费不少的时间在引入开源库上。vcpkg是在背景下开发出来的,通过vcpkg,我们可以在项目中很方便的引原创 2021-08-22 09:46:55 · 3061 阅读 · 2 评论 -
Window系统下开发Qt(5)-- 信号与槽原理
Qt的核心之一就是信号与槽。信号与槽类似观察者模式。在面向对象的编程中,都会创建很多实例,而每个实例都是独立的,要想每个实例能够协同合作,那么就会需要一种对象间传递消息的机制,在很多框架中都采用回调函数来进行对象间信息传递。回调函数就是一个函数指针,如果想要一个处理函数通知一些事件,你需要将这个指针传递给处理函数。处理函数在适当时间调用回调函数。MFC就是使用的回调函数,但回调可能是不直观的,不易于理解的,并且也不能保证是类型安全的。(1)回调函数C++虽然是面象对象的语言,但程序的具体实.原创 2020-11-22 21:03:16 · 583 阅读 · 1 评论 -
Window系统下开发Qt(4)-- 生成 ui 对应的 .h和 .cpp 文件
Qt 生成 ui 对应的 h 文件和 cpp 文件的方法将ui文件copy到uic.exe同一目录下(qt的安装目录中bin下)。 打开cmd,输入上述目录的路径。 输入:uic Com.ui -o Com.h uic Com.ui -o Com.cpp上述两条指令分别生成了h文件和cpp文件。...原创 2020-10-12 21:05:50 · 887 阅读 · 0 评论 -
Window系统下开发Qt(3)-- 在图片上绘制图形
在图像处理程序中,经常需要在图片上绘制一些图像,用以提示用户或展示一些信息。例如,需要绘制一个矩形框,显示当前处理的图像是原图像的一部分。一般在Qt中,可以使用QLabel控件来显示图片。但是使用QLabel既显示图片又显示自己绘制的图形,会很不方便。可以自定义个类,继承自QLabel,并且重写QLabel的paintEvent方法,在此方法中,绘制自己的图形。这里自定的类为MyLabel,源码如下:MyLabel.h#pragma once#include <QtWi...原创 2020-08-16 13:38:50 · 1986 阅读 · 0 评论 -
Window系统下开发Qt(2)-- 使用moc编译信号与槽
在windows下VS中开发Qt程序,若要是使用Qt的信号与槽,就得在类中使用Q_OBJECT宏,使用这个宏实际就是让Qt额外生成一些代码。若要使用这个宏,就必须使用Qt提供的moc.exe程序,来生成中间文件,下面举例介绍如何使用。例子:在窗口中,有两个控件,一个输入框(QTextEdit),一个显示文本(QLabel)控件,最终效果是在输入框中输入的文本实时性的显示在显示控件上。代码如下:MyWidget.h#pragma once#include <QtWidget...原创 2020-08-15 21:50:27 · 553 阅读 · 0 评论 -
Window系统下开发Qt(1)-- 第一个Qt程序
Windows下开发环境一般使用的Visual Studio,本人使用的是Visual Studio 2017(VS2017),在使用Qt框架时,也可以使用QtCreator,但是QtCreator调试功能没有VS那么强大,因此,本人比较推荐在VS中使用Qt框架。但在VS中使用Qt库,涉及到一系列的编译环境(头文件路径、链接的库等)设置,稍不注意就会编译不过。在这里推荐一个快捷的方式,使用微软的vcpkg来管理第三方库,可以免去下载安装各种第三方库的烦恼,Qt也可以使用这个工具进行下载安装。如.原创 2020-07-05 21:05:35 · 674 阅读 · 0 评论 -
C++笔记--模板类Traits的用法探讨
需求:设计一个绘制引擎,可以绘制不同的图形(比如:Rectangle、Circle、Polygon等)。目标:绘制引擎具有拓展性,易维护等特点。思路:绘制不同的图形的基本流程是一样的,首先需要将图形数据复制到特定的容器内,每个图形类提供了一个绘制器,调用每个类型的绘制方法,传入数据。绘制后的数据在特定的容器内,并且显示的方法都是一样(调用显卡的驱动程序,把数据复制进去即可)RectangleTraits.h#include <iostream>class RectangleT原创 2020-05-23 14:32:36 · 263 阅读 · 0 评论 -
C++笔记-临时对象的生命周期
看下面的代码#include <iostream>class MyClass{public: MyClass() { std::cout << "constructor" <<std::endl; } ~MyClass() { std::cout << "deconstructor" << std::endl; } void print() { std::cout << "print" <原创 2020-05-14 16:24:22 · 453 阅读 · 0 评论 -
C++笔记 -- 模板总结
C++模板 总结引言模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。函数模板在c++入门中,很多人会接触swap(int&amp;amp;, int&amp;amp;)这样的函数类似代码如下:void swap(int&amp;amp;a , int&amp;amp; b) {int..原创 2018-11-24 20:11:09 · 256 阅读 · 0 评论 -
C++中static_cast和dynamic_cast强制类型转换
在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast。一、static_cast关键字(编译时类型检查)用法:static_cast < type-id > ( expression ),该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性,它主要有如下几种用法:(1)用于基本数据类型之间的...原创 2019-04-08 14:00:06 · 234 阅读 · 0 评论 -
GTest使用教程(二)-- 断言和宏测试
上一讲介绍了GTest的安装和如何在项目中使用GTest,这一讲主要介绍GTest的断言机制和宏测试断言GTest采用一系列的断言(assertion)来进行代码测试,这些宏有点类似于函数调用。当断言失败时Google Test将会打印出assertion时的源文件和出错行的位置,以及附加的失败信息。用户可以直接通过“<<”在这些断言宏后面跟上自己希望在断言命中时的输出信息。...原创 2019-06-16 16:24:22 · 14908 阅读 · 0 评论 -
GTest使用教程(三)-- 运行参数
1 前言使用gtest编写的测试案例通常本身就是一个可执行文件,因此运行起来非常方便。同时,gtest也为我们提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。2 基本介绍前面提到,对于运行参数,gtest提供了三种设置的途径:系统环境变量命令行参数代码中指定FLAG因为提供了三种途径,就会有优先级的问题, 有一个原则是,最后...原创 2019-06-16 22:40:15 · 24731 阅读 · 2 评论 -
__cdecl和__stdcall的区别和联系
1、__cdecl和__stdcall __cdecl是CDeclaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 __stdcall是StandardCall的缩写,是C++的...原创 2019-07-11 15:08:51 · 13667 阅读 · 7 评论 -
阅读《Effective C++》的感悟
之前看过《Effective C++》这本书,对书中的内容印象较深刻,作者提供了很多对软件开发和设计非常有帮助的建议。最近第二次再次研读这本经典的著作,阅读到其中的一些内容时会联系到自身工作中的方案设计,结合自身的工作经验将一些感悟记录下来。1、让接口容易被正确使用,不易被误用这是原书第18条,当我们在设计一个类的时候,可能会提供一些接口给其他人使用(这里的其他人指的是使用你写的代码的其他...原创 2019-09-08 22:34:22 · 527 阅读 · 0 评论 -
C++笔记 -- 使用移动构造函数的注意点
了理解他,我们来看这样一段代码:Test.h 文件:#pragma once#include<iostream>#include<string>using namespace std;class Test{public: Test(const string& s = "hello world") :str(new string(s)) { cou...原创 2019-02-28 16:33:28 · 882 阅读 · 0 评论