C & C++
OK_boom
大龄搬砖工,酷爱计算机技术,java/C#/android/free pascal/C++。
展开
-
C++两个类互相调用的方法(类->通用类型转换)
最近修改一个C++项目,A/B两个类需要互相调用,但是.h头文件互相include是不被允许的,所以只能将其中一个类的.cpp里面引用另一个类的头文件的做法.所以这涉及到类->通用类型->类的转换,这里常用的通用类型为std::uintptr_t ,类转uintptr_treinterpret_caststd::uintptr_t(&yourclassIns)uintptr_t转类YourClass yourclassIns = (YourClass)reinterpret_原创 2021-06-29 10:49:23 · 1193 阅读 · 0 评论 -
几种C++ std::string和std::wstring相互转换的转换方法
几种C++ std::string和std::wstring相互转换的转换方法第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》):[cpp] view plain copy#include #include转载 2017-07-18 09:25:38 · 7257 阅读 · 0 评论 -
C++ 向量vector和模板的应用
C++里面的vector提供了对array/list的操作功能, 如下代码演示了如何建立vector并进行增加元素/查找元素/删除元素/枚举元素, 还演示了如何应用模板(template)来实现通用数据的vector打印.#define _CRTDBG_MAP_ALLOC#include #include #include "stdafx.h"#include #include原创 2017-07-20 11:49:03 · 4575 阅读 · 0 评论 -
C++子类执行父类的方法
需要注意的是C++的语法, 子类若有形参/名字均与父类相同的方法实现, 那么此方法将会覆盖父类的方法, 也就是说当调用子类此方法时, 不会再执行父类的方法了, 而类的构造/析构又不一样, 是会继承执行的. 比如父类有void method1(), 子类也有void method1(), 那么当对象定义为子类时, 执行method1时只会执行子类的method1, 父类的method1不执行,原创 2017-07-15 11:27:42 · 6368 阅读 · 0 评论 -
C++类继承:子类调用父类的构造函数
父类HttpUtil:#pragma once#include #include using namespace std;class HttpUtil{private: LPVOID hInternet; LPVOID hConnect; LPVOID hRequest;protected: wchar_t * mHostName; short mPort;原创 2017-07-14 16:46:46 · 1564 阅读 · 0 评论 -
Delphi调用VC的类并引用(参数,执行类方法等)
一直以为Delphi与VC之间不能进行传递对象类型参数, 所以一直以结构或更普通的数据类型交换数据 , 但前段时间得一大神传授, 终于知道如何实现类对象的传递. 需要注意的是C++里面的struct才能与delphi里面的class一一对应, 而且,struct里面的元素地址不能随意改变(比如setlength),不然就AV了. 具体代码在: http://git.osch原创 2017-06-24 22:57:19 · 1428 阅读 · 0 评论 -
C++ delete的使用
delete /delete[] 会根据变量地址的数据类型来释放内存,直接调用delete/delete[]不会有问题, 但如果将它放在函数里面如ICLASS_API void __stdcall fastDeleteArrs(void* pvAddr){ delete[] pvAddr;} 然后主程序用fastDeleteArrs来释放各种类型的指针就非常原创 2017-06-20 12:15:10 · 5086 阅读 · 0 评论 -
在dll里面申请内存, 主程序释放导致AV
查资料得知, dll里面申请的内存与主程序内存存放地方不一致, 所以dll里面new的内存, exe里面delete是要AV的. 所以只有在dll里面再export一个delete功能的api出来 :ICLASS_API void __stdcall fastDelete(void* pvAddr) { delete pvAddr;}ICLASS_API void __s原创 2017-06-19 23:23:01 · 1114 阅读 · 1 评论 -
Opencv3.2的静态编译lib及引用
已编译好一份opencv3.2 的vs2017 静态lib : http://pan.baidu.com/s/1pLJPLEF 找这些依赖库真不是容易的事, 各种编译错误, 最终搞定. 为备忘和为后人造福, 特贴出: MTd mode的依赖库引用:Vfw32.Libippicvmt.libIlmImfd.liblibjasperd.liblibjpegd.libli原创 2017-06-19 16:46:51 · 2911 阅读 · 0 评论 -
[VC]setsockopt 设置socket 详细用法(超时、非阻塞等)
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr,sizeof(BOOL));2. 如果要已经处于连接状态的soket在调用closesocket后转载 2017-06-07 16:31:09 · 3060 阅读 · 0 评论 -
C++里面的malloc与new的区别
malloc单纯分配内存, 不能生成类实例,也不会对分配后的内存进行初始化, 一般随后需要用memset(p,0,sizeof(struct...))进行内存初始化, 否则结构体里面的char[]类型的变量用 strlen不能返回正常的长度(必须用sizeof返回), 由它分配的内存需要用free进行释放 .而new除了分配内存, 也可以产生类实例, 而且分配的内存已经进行初始化, 可以用si原创 2017-08-07 16:49:03 · 511 阅读 · 0 评论 -
尝试在C++里实现 Java 的 synchronized 关键字
话说Java里有个很强大的关键字叫synchronized,可以方便的实现线程同步。今天异想天开,尝试在C++里模拟一个类似的。 最近在学习C++的STL,看见智能指针这章节时,无不感叹利用语言的丰富特征,来各种实现各种巧妙的构思。最经典的莫过于使用栈对象构造/析构函数,来维护局部资源的初始化和释放。照着这个巧妙的方法,依样画葫芦自己也来写一个,来实现局部代码线程同步。 Jav转载 2017-07-18 17:39:10 · 538 阅读 · 0 评论 -
C++将char/char*/string/int加入到string中
#include using namespace std;... char c = 'A'; char* lvlpcStr = "hello"; string lvStr,lvSubStr = "sub string"; lvStr.push_back(c); lvStr.append(lvlpcStr); lvStr.append(lvSubStr); char原创 2017-07-19 12:25:31 · 3533 阅读 · 0 评论 -
Delphi 与 C/C++ 数据类型对照表
更新,下面这table为最新的tokyo基本数据类型与C++的对照关系:Delphi to C++ types mappingGo Up to Support for Delphi Data Types and Language ConceptsBelow is a list of Delphi data types and the correspond转载 2015-09-24 11:53:48 · 6958 阅读 · 0 评论 -
VC获得显示器状态(捕获息屏/亮屏事件)
在vista版本之后, 应该注册GUID_CONSOLE_DISPLAY_STATE事件了, 上代码:#include "stdafx.h"#include #include using namespace std;LRESULT CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wPara原创 2017-08-03 16:42:59 · 4277 阅读 · 3 评论 -
C++简单的写文本文件代码
FILE* fp = _wfopen(L"o.txt", L"wt,ccs=unicode");fwprintf(fp, lvwS.c_str());fclose(fp);原创 2017-08-02 11:54:21 · 2445 阅读 · 0 评论 -
基于boost的ini 文件读取/枚举/写入操作
[setting]key1=1key2=hello上面是ini文件的内容, 运行如下代码:void testIniParser() { using namespace boost::property_tree; ptree lvptProperties; ini_parser::read_ini("d:\\temp\\win.ini", lvptProperties); bas原创 2017-07-24 15:39:06 · 5329 阅读 · 0 评论 -
boost 处理命令行选项参数
// genmac.cpp : 定义控制台应用程序的入口点。//#define _CRTDBG_MAP_ALLOC#include #include #include "stdafx.h"#include #include #include #include #include #include #include using namespace std;using原创 2017-07-22 13:34:55 · 1095 阅读 · 0 评论 -
C++的异常抛出与捕获
手动抛出异常用如下例子代码, 注意不能用new ,因为C++新建一个类实例(不是实例指针)是不需要new的if (mllTmDiff == -99999999999999) { throw exception("login bms server first !");}异常的捕获:try{ your code ....}catch (exception & e) {原创 2017-07-19 16:08:52 · 884 阅读 · 0 评论 -
C++获得数组长度
这个与delphi/pascal/java不一样, 它没有length属性或函数获得数组长度, 要自己计算,比如int lvBases[] ={ 2,4,8,16,32,42 }; 要求lvBases的长度, 要用sizeof(lvBases)/sizeof(int), 就是总长度/单元类型的长度.原创 2017-07-19 15:56:01 · 631 阅读 · 0 评论 -
任意进制的数值转换 C++版
java版在这里: http://blog.csdn.net/rocklee/article/details/46470047 由于在gen key方面压缩数据,所以在C++方面也用上了, 今天将java版翻译了一遍:#include "Utils.h"#include #include #include namespace freestyle { string C_CODE原创 2017-07-19 15:08:09 · 484 阅读 · 0 评论 -
使用CAsyncSocket类进行网络编程
1 服务器端由先得专门为服务器端做一个Socket通信类CNewSocket类,此类继承CAsyncSocket类,专门负责服务器端socket通信事情:NewSocket.h:[cpp] view plain copy#pragma once #include "afxsock.h" //此类专门用来与客户端进行转载 2017-06-07 16:30:37 · 5015 阅读 · 5 评论 -
boost于vs2017下编译(64/32bit)
下面文章是vs2015编译, 将140换为141,则可以编译给vs2017用. 编译并使用boost库(win7+boost1.63+vs2015+32位or 64位)标签: windowsboost1.63vs64322017-04-15 22:02 752人阅读 评论(0) 收藏 举报 分类:c、c++(43)转载 2017-06-06 17:32:41 · 10079 阅读 · 0 评论 -
NTP协议
NTP协议资料: http://support.ntp.org/bin/view/Support/DraftRfc2030 c++的数据包定义如下 :typedef struct ntp_time{ UINT32 coarse; UINT32 fine;} ;struct ntp_packet{ unsigned char leap_ver_mode; //chr(原创 2017-06-01 17:25:16 · 3580 阅读 · 0 评论 -
vc版run as (指定用户运行)
// runas.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include #include "locale.h"void DisplayError(LPWSTR pszAPI){ LPVOID lpvMessageBuff转载 2017-05-25 20:19:05 · 856 阅读 · 0 评论 -
VC/C#调用lazarus写的dll
包含了普通类型的参数传递, 结构体传递, 字符串的传入/传出 还有callback等.点击打开链接原创 2017-05-12 20:16:16 · 1181 阅读 · 0 评论 -
VS2010中添加lib库引用
一.VS2010中添加lib库引用:1 菜单 项目---> 属性--->配置属性-->链接器---->输入---附加依赖项, 加入库名,如: my_API.lib; 或是在cpp源文件中用代码#pragma comment(lib,"my_API.lib")代替. 此时再编译会提示错误:fatal error LNK1104: 无法打开文件“my_API.lib” , 原因应该是转载 2017-04-20 14:29:56 · 6098 阅读 · 0 评论 -
字符串应用,过滤关键字,char*版/string版/CString版
有空就写着练手,感觉C++比delphi麻烦太多了.下面是char*版本#include "stdafx.h"#include #include using namespace std;int main(){ char *lvKey = "ab"; int lvKeySize = strlen(lvKey); char *lvBuf = new char[1024]; while原创 2017-04-20 11:32:28 · 732 阅读 · 0 评论 -
CString与string、char*的区别和转换
我们在C++的开发中经常会碰到string、char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆。下面详细介绍这三者的区别、联系和转换:各自的区别char*:char*是一个指向字符的指针,是一个内置类型。可以指向一个字符,也可以表示字符数组的首地址(首字符的地址)。我们更多的时候是用的它的第二的功能,来转载 2017-04-13 14:38:36 · 9020 阅读 · 1 评论 -
VC学习1: 函数返回类实例的方法
由于刚学习C++, 一个很傻的错误等到一点多才解决, 函数需要返回一个CStringArray的类型, 刚开始我是这样写的:CStringArray Printers::getPrinters(){ CStringArray lvRet; DWORD dwSize, dwPrinters; ::EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER原创 2017-04-12 22:46:01 · 945 阅读 · 0 评论 -
分块下载文件
最近研究了一下关于文件下载的相关内容,觉得还是写些东西记下来比较好。起初只是想研究研究,但后来发现写个可重用性比较高的模块还是很有必要的,我想这也是大多数开发人员的习惯吧。对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可: GET /Path/FileName HTTP/1.0 Host: www.server.com:80 Accept: */* Us转载 2016-03-18 15:31:41 · 3392 阅读 · 0 评论 -
C语言的枚举及指针
初学C语言, 在努力啃骨头,,,,,读书笔记之枚举及指针应用 ... 总结一下, 定义枚举,用typedef enum关键字, 比如 typedef enum{Red,Green,Blue} Color3; 枚举到数值的转换,如果没有指定代表数值就是从0开始算, 比如 Color3 c=Red; printf("%d",c);会显示0, 除非指定 如typedef原创 2015-07-17 15:12:04 · 4292 阅读 · 0 评论 -
VC 中char 与 wchar的转换
char 转 WCHARWCHAR * charToWchar(char *s){ int w_nlen=MultiByteToWideChar(CP_ACP,0,s,-1,NULL,0); WCHAR *ret; ret=(WCHAR*) malloc(sizeof(WCHAR)*w_nlen); memset(ret,0,sizeof(ret)); Mult原创 2015-07-28 16:50:08 · 10367 阅读 · 0 评论 -
VC的字符串转换atlconv的使用
如果单纯将char* 转wchar*/wchar*转char*, 可以用altconv提供的函数库进行转换, 比如A2T, T2A,A2W,W2A, 但记得在使用这些函数前加上USES_CONVERSION;例子:#include .... CString lvT; mEdSrvIp.GetWindowTextW(lvT); USES_CONVERSION; char* lv原创 2017-05-26 12:09:30 · 740 阅读 · 0 评论 -
vc工程内存泄露检测方法
内存泄漏,即未能正确释放以前分配的内存,是 C/C++ 应用程序中最难以捉摸也最难以检测到的 Bug 之一。 最初少量内存泄漏可能不引人注目,但随着时间的推移,内存泄漏越来越多,就会出现一些征兆,包括性能下降,在应用程序内存不足时发生崩溃。 更严重的是,占用了所有可用内存的泄漏应用程序可能会导致其他应用程序崩溃,从而无法确定问题出在哪个应用程序。 即使看似无害的内存泄漏也可能说明存在其他问题应当纠转载 2017-05-26 12:24:47 · 494 阅读 · 0 评论 -
从Delphi返回动态数组到C#和C++
经过很多尝试, Delphi/pascal无法将array of integer这样的数组返回给C#,只能传数组的地址过去, C#以IntPtr类型的参数接收, 然后通过Marshal将指针所指的内容复制出来 delphi的dll声明:function dumpRegisters(out pvOut: PInteger; out pvSize: word): boolean; st原创 2017-05-20 15:55:49 · 1425 阅读 · 0 评论 -
让MFC的控件跟随当前windows风格
mfc默认的控件相当古板,与当前win95一样, 在论坛上请求一大神得知, 需要在工程里stdafx.h后面添加:#ifdef _UNICODE#if defined _M_IX86#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' versi原创 2017-06-06 14:29:20 · 629 阅读 · 0 评论 -
判断两个Mat图像是否绝对相等
先比较结构体参数是否一致,再用memcmp比较图像数据是否一致.bool matIsEqual(const cv::Mat mat1, const cv::Mat mat2) { if (mat1.empty() && mat2.empty()) { return true; } if (mat1.cols != mat2.cols || mat1.rows != mat2.rows原创 2017-06-17 13:48:59 · 7631 阅读 · 2 评论 -
C++函数返回指针结果的坑.
可能被java惯坏了, 这个坑居然踩过两次,特意备注下: 以下一个MAT转IplImage的例子:Mat srcImage = imread("1.jpg");IplImage* lvRet = &IplImage(srcImage);cvShowImage("aa", lvRet); 运行之,没问题的,可以显示图像 。 但是, 将转换函数放在一个独立的函数里面就不原创 2017-06-17 09:00:15 · 2183 阅读 · 2 评论 -
C++ free与delete区别
free函数是由C语言继承而来的,是和malloc配对的,而不能和new配对。free释放内存的和delete可以说是两套代码,它们的逻辑不同,不能混用。用new申请的就要用delete翻译,用malloc申请的就要用free释放。顺便说一下它们还有一个区别, free 只是告诉操作系统回收内存,而delete会先调用类的析构函数,然后才告诉操作系统回收内存。下面是收藏的一个帖子:转载 2017-05-20 21:18:34 · 2848 阅读 · 1 评论