代码碎片
文章平均质量分 67
宇龍_
有些白嫖党连个赞都不点甚至直接抄走了说原创,新发布的都写到专栏里吧,哎。
私聊给群号,可进Q群咨询问题。
展开
-
一种插件式的Windows程序设计原理
前言在这里分享一种方法,一种非常巧妙的插件式Windows程序设计方法基本原理这种插件式的Windows程序设计方法,即一个进程多个DLL,理论上可以无限扩张。程序中的每个功能模块都是一个单独的DLL,每个DLL之间又可以相互进行通信,DLL A可以发送消息到其他任意一个DLL中,也可以接收其他任意的DLL发送来的消息,而且要求收发消息采用通用接口,接口能支持同步和异步两种模式。DLL之间还能支持单播、多播、广播,也就是说DLL A可以通过发送一次消息,来实现同时调用其他任意个数的D原创 2022-04-23 13:32:17 · 1557 阅读 · 0 评论 -
do{}while()的妙用
有时候在代码中经常看到do{}while(0),do{}while(false)这种看起来有点奇怪的形式,实际上在项目中使用这种方式是非常妙的,可以减少函数逻辑中很多return或者多层嵌套if...else...的形式,可以很简单的实现在函数中只有一个return,见如下代码:#include <stdlib.h>#include <stdio.h>//权限校验函数bool DoCheck(int n){ bool bRet = false; do {原创 2022-04-16 14:25:45 · 487 阅读 · 0 评论 -
在构造函数中调用构造函数(C++中的误用)
C++中,在构造函数中调用构造函数是一种误用,demo如下:#include <stdio.h>class Test{public: int a; Test() { printf("construct Test()...\n"); Test(88); } Test(int a) { printf("construct Test(int a)...\n"); a = 8原创 2021-09-08 16:14:35 · 690 阅读 · 3 评论 -
类普通成员函数的本质以及类普通成员函数中的静态变量
类普通成员函数的本质以及类普通成员函数中的静态变量Test类的代码如下:class Test{public: void test() { static int a = 4; ++a; printf("%d\n",a); }};类的普通成员函数本质上就是隐藏了一个this指针,如Test类中的test方法,其原型本质上就是void test(Test* this);至于传递this指针,不过是由编译器完成罢原创 2021-09-08 14:48:03 · 261 阅读 · 0 评论 -
C++踩坑记录
维护别人写的代码,代码如下:std::unique_ptr<Test> test(new Test); //1 实际项目中并不是使用的stl中的智能指针,是别人封装的,而且我这里没有源码test->connect(); //2代码运行正常,由于代码调整,我注释了第二行,运行报错。。。。一度怀疑智能指针的代码有问题,却苦于没有源码。。最后在在Test类中看到这一幕:Test(){}~Test{ if(NULL !=原创 2020-06-04 14:28:04 · 227 阅读 · 0 评论 -
C++单例类的内存自动回收
就是利用类静态成员在程序运行结束后会自动释放的原理,在其析构函数中释放其管理的内存。直接贴代码:#include "stdafx.h"#include <stdio.h> class Test{public: static Test&GetInstance() { if(NULL == m_pInstance) m_pInstance = new Test; return *m_pInstance; }private: static Test原创 2020-05-29 10:01:56 · 680 阅读 · 0 评论 -
字节对齐的原因及计算方法
看了网上很多的相关文章,反而容易搞迷糊,在此详细总结一下,不明白的朋友可以在下方留言。一、为什么需要字节对齐?因为各个硬件平台对存储空间的处理上有很大的不同,一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台...原创 2020-02-24 10:31:46 · 1303 阅读 · 1 评论 -
中小型公司C++面试问题
中小型公司一般面试会倾向于问一些比较有工程性、实用性的问题一、C++有哪些存储区1、栈区(先进后出)由编译器自动分配释放,存放函数的参数值,局部变量值等,其操作方法类似数据结构中的栈。2、堆区这里的内存是由程序员自己管理的,例如:申请内存、释放内存malloc free new delete alloc destroy若程序员不释放,程序结束时可能由OS回收。3、静...原创 2020-02-20 14:14:50 · 614 阅读 · 0 评论 -
char[0]不是你想用想用就能用
前言新了解char[0]的少年们很愉悦的将其应用到了项目中,多看一条注意事项可以减少不必要的痛苦。引言在C语言中char[0]是一种数组的特殊用法,用于标记一个指针在一个结构体最后:例如:struct node{int number;//后面的数据长度char data[0];//这是一个指针,不占空间}sizeof(node)就等于sizeof(int);更......原创 2019-04-14 21:42:32 · 13467 阅读 · 0 评论 -
udp内网穿透的要点
UDP打洞的过程:1、双方都通过UDP与服务器通讯后,网关默认就是做了一个外网IP和端口号与你内网IP与端口号的映射,这个无需设置的,服务器也不需要知道客户的真正内网IP2、用户A先通过服务器知道用户B的外网地址与端口3、用户A向用户B的外网地址与端口发送消息,4、在这一次发送中,用户B的网关会拒收这条消息,因为它的映射中并没有这条规则。5、但是用户A的网关就...原创 2019-11-07 20:40:50 · 4059 阅读 · 0 评论 -
C++编译原理-彻底解决链接错误
前言:在开发项目的时候会经常性的出现各种各样的链接错误。究其原因是因为对C++的编译过程不理解所致。当深入理解了整个编译的过程,那么所有的问题将迎刃而解。要点:1、头文件中使用 #pragma once //vs一般自动生成//test.h#pragma once//接下来是头文件的内容2、头文件中使用条件编译#ifndef.......#define.......原创 2019-10-20 22:48:54 · 9059 阅读 · 0 评论 -
VC++ TCP编程实例
直接上代码客户端:// TcpClient.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <winsock2.h>#pragma comment(lib, "WS2_32")#include <iostream>#include "../../public/Message.h"using na...原创 2019-09-24 20:09:52 · 10692 阅读 · 0 评论 -
memset陷阱
1、不能用memset操作对象memset甚至会修改虚表指针以下代码会崩溃:class Base{public: virtual void test() { printf("base \n"); }};class Test:public Base{public: virtual void test() { ...原创 2019-09-23 19:57:13 · 9971 阅读 · 0 评论 -
指向静态成员函数和普通成员函数的指针
相当于是熟悉一种语法吧class Test{public: static void StaticFunc() { printf("StaticFunc \n"); } void NormalFunc() { printf("NormalFunc \n"); }};int main(){ voi...原创 2019-09-22 20:17:51 · 9972 阅读 · 0 评论 -
switch语句的缺点及替代方案
前言switch语句是我们经常使用的,在平时的项目中基本不会有什么问题,但是某些场景下,switch的条件分支可能会成千上万个(如服务器或客户端处理消息id的逻辑),这会导致项目难以维护。switch语句缺点大量条件的switch语句缺点如下:每个条件处理逻辑太长,不便查看;当有从1-10000个条件是,如果条件是1w,那么该逻辑要判断上万次;break容易漏写,导致产生不...原创 2019-09-22 19:57:47 · 13210 阅读 · 0 评论 -
C/C++基于TCP的通信协议解决方案
经过本人的分析与项目实战,一种基于收发结构体的方案是非常可靠且方便的。具体方法是,所有的结构体继承自一个结构体,stBase,而stBase的成员只有一个整形的消息id,将收到的消息存到缓冲区后(处理好粘包),将缓冲区强制转换成stBase,通过id来判断对应的业务消息,再强制转换成对应的结构体。消息的定义:这里处理一个基结构体外,只写了两个业务结构体,struct stBa...原创 2019-09-19 21:37:02 · 11497 阅读 · 0 评论 -
简易string类的实现
在面试的时候,经常会让写一个字符串类,看似很简单的问题,其实经常出错。闲来没事,就写个简单字符串类吧。功能实现容量的概念,size和capacity构造、析构、拷贝构造重载=,+,[]运算符swap交换函数,push_back,pop函数扩容函数右值引用小难点高效的swap交换空字符串类的形式扩容实现必须使用友元函数的operator+右值引用的...原创 2019-08-29 21:31:14 · 9851 阅读 · 0 评论 -
回调函数妙用-函数指针
话不多说,上来就是一段代码,之后解释#include "stdafx.h"//定义回调函数类型typedef void(*_CALLBACK)(void *pUser);//设置回调函数void gFunc(_CALLBACK fun,void *pUser){ fun(pUser);}//测试类class Test{public: Test():...原创 2019-08-12 21:58:33 · 10181 阅读 · 0 评论 -
静态成员函数访问非静态成员
有时候我们必须要使用静态成员函数, 比如把静态成员函数的指针传递到别的模块,以实现回调函数的机制,这个时候若不使用普通函数,则必须使用静态成员函数。这时候我们有可能需要本类的非静态成员,具体做法很简单,即将类对象作为静态成员函数的参数即可。class Test{public: Test() :m_id(66) {} static void printMyID(...原创 2019-08-12 21:47:52 · 10737 阅读 · 0 评论