C++实现简单的反射——根据字符串创建类对象

2020-01-15
阅读 6 分钟
4.8k
最近项目需求中需要一个关键功能——根据字符串创建了类对象。由于C++没有类似Java、C#这类动态语言中的反射机制,所以在C++程序中一般用if...else...或者switch来将字符串或者枚举值与类对象的创建方法来进行对应的映射。这里如果我们实现一个简单的反射机制,可以根据字符串创建了类对象就可以简化这个过程,而且无论对...

10分钟带你了解轻量级插件框架x3py

2020-01-15
阅读 9 分钟
3.3k
由于本人目前主要从事的是Windows客户端开发方面的工作,所以本文介绍x3py的侧重点也是从客户端程序开发者方面叙述的。本文主要参考整理自x3py的官方Wiki,修正了一些官方示例中的错误。有兴趣的同学可以直接阅读原文。

Duilib中让弹出窗口整体能被拖动的两种方法

2020-01-15
阅读 3 分钟
3k
基础知识:鼠标在窗口内移动,点击或者释放时都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,系统会根据这个枚举值进行相应的处理。当返回值为HTCAPTION时,系统会认为此时鼠标位于标题栏上,因而当鼠标按下并移动时就会执行拖动操作。

Windows系统中owner-owned 关系和 parent-child关系

2020-01-15
阅读 3 分钟
3.6k
在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表。系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口。这个数据结构中有四个数据用来构建list,即child、sibling、parent、owner四个域。

C++面试再进阶

2020-01-14
阅读 5 分钟
1.3k
答:定义数组大小的限制主要是看数组定义在内存的哪个区域内。局部非静态的数组,空间在程序的栈上分配,不同平台的栈大小不同:SunOS/Solaris是8M,Linux是10M,Windows是1M,AIX是64M,都是可以调整的。也就是说,数组大小的限制就是堆或栈或全局存储区大小的限制。如果想定义长度一百万的数组可以将数组申明在全局存...

C++面试题进阶

2020-01-14
阅读 7 分钟
1.4k
pA和pC相等,pB和pC不相等,因为基类ClassA中定义了虚析构函数,运行时会将他直接指向派生类,而ClassB的则会进行一个隐式转换。

C++信号槽

2020-01-13
阅读 2 分钟
2.9k
一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知;一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候——也可以说是信号发出的时候——被调用的函数;你可以将信号和槽连接起来,形成一种观察者-被观察者的关系;当事件或者状态发生改变的时候,信号就会被发出;同时,信号发出者有义务调用...

《程序员的自我修养》(三)——库与运行库

2020-01-12
阅读 6 分钟
2.3k
应用程序使用的内存空间一般都会包括以下“默认”区域: 栈:栈用于维护函数调用的上下文。通常栈在用户空间的最高地址处分配,可能会有数兆字节的大小。

《程序员的自我修养》(二)——装载与动态链接

2020-01-12
阅读 8 分钟
3.3k
每个程序都拥有自己独立的虚拟地址空间,这个空间大小由计算机硬件平台决定(理论上的最大上限)。比如,32位硬件平台的虚拟地址空间的地址为0到232-1,即0x00000000~0xFFFFFFFF,总共大概4G;而64位硬件平台的虚拟地址空间地址为0到264-1,即0x0000000000000000~0xFFFFFFFFFFFFFFFF,大概有17179869184G。在32位平台上,Li...

《程序员的自我修养》番外笔记——符号解析与重定位

2020-01-11
阅读 3 分钟
3.9k
程序如下: 重定位 先来看这段代码的反汇编结果。 "main"的起始地址为0x00000000,这是因为在未进行空间分配之前,目标文件代码段中的起始地址以0x00000000开始,等到空间分配完成以后,各个函数才会确定自己在虚拟地址空间中的位置。 偏移为0x18的地址上是一条mov指令,总共8个字节,它的作用是将“shared”的地址赋值到e...

《程序员的自我修养》(一)——编译与静态链接

2020-01-11
阅读 4 分钟
1.6k
在UNIX中,硬件设备的访问形式跟访问普通的文件形式一样;在Windows系统中,图形硬件被抽象成了GDI,声音和多媒体设备被抽象成了DirectX对象,磁盘被抽象成了普通文件系统,等等。

如何处理git的Auto packing

2020-01-10
阅读 1 分钟
2.1k
当我们的git仓库运行一段时间后,可能会很大,仓库内保存的git object过多。这时当你执行一些git命令,例如git pull,的时候就会有这样的提示:

合并单个commit到指定分支上——tortoisegit cherry pick 的使用

2020-01-10
阅读 2 分钟
5.8k
当我们使用git管理一个程序的源码时,总是会新建很多分支。不同的分支可以直接使用merge来合并代码。但我们有时候会有这种需求,比如说我们有n个分支分别开发不同版本的程序,其基础功能是一样的,但是不同分支上有不同的需求开发,这时我们的基础功能上有一个bug的修复想同步到其他分支上就不能使用merge了,因为merge...

C++智能指针作为成员变量

2020-01-09
阅读 2 分钟
4.1k
C++11为我们提供了shared_ptr、unique_ptr和weak_ptr这三种智能指针帮助我们更方便安全的使用动态内存。它们都定义在memory头文件中。智能指针的常见用法大家都应该很熟悉了,今天我想说一下智能指针作为成员变量时的用法。比如上面这段代码,我想类Settings中的Device指针换成智能指针,那么getDevice应该是什么样的呢?

std::string的format一种实现

2020-01-09
阅读 3 分钟
4.7k
由于std标准库的string没有实现类似CString的Format函数,使得我们有时候不得不使用istream、ostream来格式化字符串,然而这些类使用起来又复杂繁琐。在Windows下编程时我们还可以使用CString的Format函数,但是这里也可能会涉及到字符类型的转换等问题。而且使用CString的Format函数就意味着代码无法做到跨平台。

PC客户端软件升级方式简史

2020-01-07
阅读 3 分钟
2.9k
在windows8之前,微软的Windows平台一直没有提供一个想苹果的AppStore或者Linux的包管理这样的统一软件管理工具。所以Windows下的软件安装、升级、卸载的事情一般都是软件自己去负责。这样导致Windows下的软件安装、升级、卸载的方式五花八门,但总体上来说方法都大同小异。安装程序主要分两种,下载器的安装包和离线安...

基于Duilib的win32程序实现最小化到托盘

2020-01-07
阅读 2 分钟
2.8k
最近在学习使用Duilib,这个库实现PC程序的界面确实很方便。Duilib中的demo程序全是点击关闭按钮程序就关闭了,所以这里我实现了一个点击关闭按钮后程序最小化到托盘的效果。以及常规的,鼠标左键点击托盘里的程序图标后程序正常显示。右键点击后出现退出菜单,点击退出按钮后程序正常退出。下面是关键部分源码:

C++代码书写规范——给新手程序员的一些建议

2020-01-06
阅读 4 分钟
1.4k
代码就是程序员的面子,无论是在工作中在电脑上写程序代码还是在面试时在纸上写演示代码我们都希望写出整洁,优雅的代码。特别在工作中当我们碰到需要维护别人的代码,或者是多人参与一个项目大家一起写代码的时候,如果碰到一些丑陋的代码,我们还要看懂并且修改它的时候,那种难受,肯定会让我们回想起多年以前自己还...

MarkDown基础语法

2020-01-06
阅读 2 分钟
1k
MarkDown发展到现在已经基本上被很多人认同和接受了。MarkDown语法简洁,易于掌握,所以用它来码字是件既效率又舒服的事情。这里我默认大家对MarkDown已经有基本的了解,不用我再做过多的介绍了。Linus大神说:“Talk is cheap,Show me the code.”。那么我们直接开始。

Windows下GDI编程注意事项

2020-01-05
阅读 2 分钟
3.7k
在Windows PC上编程,GDI是一个很重要的技术点。很多程序在运行一段时间后出现异常,导致程序崩溃,除了众所周知的内存泄露以外,GDI资源泄露也是一个很直接的原因。下面是我列出的一些注意事项。

C++中使用JsonCpp

2020-01-05
阅读 3 分钟
4.4k
之前项目中我们客户端程序一直是使用XML与服务器通信,最近新增一些接口转向使用更简单的Json。我们都知道由于Json语法是 JavaScript 对象表示语法的子集。所以在Java,JavaScript等语言中使用起来是十分愉快的。在C++中我们使用跨平台的开源库JsonCpp也能愉快的玩耍Json。

大数乘法问题(C++版)

2020-01-05
阅读 3 分钟
1.6k
近日参加一个笔试,遇到大数乘法问题,这是一个经典的算法题。所谓大数乘法问题其实就是这样的:输入两个整数,要求输出这两个数的乘积。输入的数字可能超过计算机内任何数据的存储范围。这里主要需要注意的点就是需要使用字符串或者字符数组来存储这两个大数以及他们的结果,还有乘法计算过程中存在乘法进位和加法进位。

ActiveX控件注册的几种方法

2020-01-04
阅读 2 分钟
2.4k
ActiveX控件是一个动 态链接库,是作为基于COM服务器进行操作的,并且可以嵌入在包容器宿主应用程序中,ActiveX控件的前身就是OLE控件。由于ActiveX控件与 开发平台无关,因此,在一种编程语言上开发的ActiveX控件可以无须作任何修改,即可在另一种编程语言中使用,其效果如同使用Windows通用控件 一样。如:在VC++中开...