C++
文章平均质量分 54
C++基础
阳光柠檬_
...
展开
-
2.COM接口
2.1 再谈接口与实现其实从上一章“COM是个更好的C++”可以看出,COM最重要的就是将接口与实现分离。上一章中接口定义头文件中采用C++抽象类的形式,如果调用方是C++环境当然不会有问题。但如果调用方不是C++的编译环境呢?为了把“接口定义”与“特定实现过程所用到的语言”之间的关联尽可能的断开,我们必须把这两项分离开来,如果所有参与的各方统一使用一种语言(而非C++抽象基类)来定义接口,...原创 2020-01-31 22:33:06 · 990 阅读 · 0 评论 -
1. COM是一个更好的C++
看COM本质论做的总结1.1 软件分发和C++class FastString { char* m_psz;public: FastString(const char *psz); ~FastString(); int Length(void) const; int Find(const char *psz)const;};#include "faststring.h"#i...原创 2020-01-31 22:30:33 · 1164 阅读 · 0 评论 -
libcurl http get
#include <curl.h>#define XML_MAX_SIZE 1024*16char gbuf[XML_MAX_SIZE] = {0};int len = 0;static size_t string_write(char *ptr, size_t size, size_t nmemb, char *buf){ pthread_mutex_lock(&write原创 2016-11-16 16:54:04 · 418 阅读 · 0 评论 -
C++11 智能指针unique_ptr
在C++11标准之前的C98标准中,STL里面只有auto_ptr这一种智能指针。 而在C++11标准中除了auto_ptr还有如下三种:unique_ptr smart pointer with unique object ownership semantics 只能有一个主人的指针,可以做为STL容器的元素 (弥补了auto_ptr不能作为容器元素的缺点)shared_ptr smart原创 2016-12-13 16:51:33 · 509 阅读 · 0 评论 -
C++11 lambda表达式 详解
如下图,lambda表达式由下面几个部分构成: C++11 的 lambda 表达式规范如下:[ capture ] ( params ) mutable exception attribute -> ret { body } 是完整的 lambda 表达式形式[ capture ] ( params ) -> ret { body } const 类型的 lambda 表达式,该类型的表原创 2016-12-13 16:16:10 · 4445 阅读 · 0 评论 -
C++读取注册表
C++读取注册表:#include <shlobj.h>#include <windows.h>#include <shellapi.h>void getRegeditValue(TCHAR* retValue){ HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭 LPCTSTR data_Set = TEXT("Software\\WOW6432Node\\Mi原创 2016-12-09 09:32:21 · 818 阅读 · 0 评论 -
C++启动另一个程序
打开另一个程序, QT中比较简单:QProcess *process = new QProcess;QStringList str;str << "";//process->start("C:\\Program Files (x86)\\MyAPP\\app.exe", str);process->start(m_installPath + "\\" + RUN_EXE, str);不用Q原创 2016-12-09 09:57:15 · 6178 阅读 · 0 评论 -
C++11 中std::function和std::bind的用法
关于std::function 的用法: 其实就可以理解成函数指针 1. 保存自由函数void printA(int a){ cout<<a<<endl;}std::function<void(int a)> func;func = printA;func(2);保存lambda表达式std::function<void()> func_1 = [](){cout<<"he原创 2016-12-15 11:29:38 · 22929 阅读 · 2 评论 -
C++11 中std::thread和std::mutex的用法
关于线程,之前用的最多的就是C语言的 pthread 系列函数; QT中也有QThread 类可以直接用。 偶然发现C++11 中早已经拥有了一个更好用的线程类std::thread 下面简单介绍一下std::thread的基本用法吧#include <thread>bool HelloWorld::init(){ std::thread t1(&HelloWorld::first原创 2016-12-15 12:20:33 · 5912 阅读 · 0 评论 -
C++正则表达式匹配
例子:匹配 room_id=13549846QRegExp使用 QString getData = curlSimple.GetSimple(url); QDBG << getData; QRegExp rx("room_id=[\\d]{1,15}"); rx.indexIn(getData); QString roomIDstr = rx.cap().remo原创 2017-02-06 11:52:27 · 1468 阅读 · 0 评论 -
C++启动其它exe程序的代码
先取到所要启动exe的绝对路径,比如: C:\Test\update.exe 也要得到exe所存在的目录路径,比如: C:\Test1.先用Qt实现QString path = "C:\\Test\\update.exe";QString runPath = "C:\\Test";QProcess *process = new QProcess;process->setWorkingDirec原创 2017-11-22 09:22:13 · 11227 阅读 · 0 评论 -
C++类头文件不暴露私有变量的一种写法
在类的头文件中不暴露私有变量,目的一般有两个: 1. 提供给别人的dll对应的头文件中,不希望在头文件中暴露私有变量的名称; 2. 因为私有变量的类型需要包含另一个头文件,所以不希望在头文件中包含其它头文件;一般可以用下面的方法来隐藏私有变量。 TWebSocketServer.hclass TWebSocketServer{public: TWebSocketSe原创 2018-01-26 14:52:19 · 5353 阅读 · 1 评论 -
基于curl C++简单的get/post封装
基于curl简单的get/post封装#include <curl.h>#include <memory>static size_t string_write(char *ptr, size_t size, size_t nmemb, std::string &str){ size_t total = size * nmemb; if (t...原创 2018-03-16 18:23:37 · 1310 阅读 · 0 评论 -
Nginx + FastCgi + C++实现web后台
用python写过后台服务器,现在的团队项目用的nginx + php写后台,用Nodejs也能写Web服务,用golang也能写后台。一直觉得万能的C++无所不能,那用C++开发后台的为啥几乎没有呢?网上搜了一下,大多说C++需要较高的技术门槛,从底层开始自己造轮子,没有很好的直接能用的标准库等等。不过我还是抱着试一试的心态打算用C++架一个后台服务框架。环境是linux下运行,只是...原创 2018-03-13 12:06:13 · 3624 阅读 · 0 评论 -
纯C++实现的HTTP请求封装(POST/GET)
纯C++实现的HTTP请求(POST/GET),支持windows和linux, 进行简单的封装, 方便调用。实现如下:#include "HttpConnect.h"#ifdef WIN32#pragma comment(lib,"ws2_32.lib")#endifHttpConnect::HttpConnect(){#ifdef WIN32 //此处一定要初始化一下,否则ge原创 2016-09-14 15:18:41 · 27863 阅读 · 21 评论 -
C++回调函数实现
库的头文件中申明回调函数接口:#ifndef BYTE#define BYTE char#endiftypedef void (CALLBACK* fun_SetMediaVideoStreamSendCallback)(const BYTE* chBuff, int iBufLen);BUILD_DLL_EXPORT void sdl_set_videostream_callback(fu原创 2016-06-30 15:47:53 · 1066 阅读 · 0 评论 -
STL标准容器中内容的几种打印技巧
copy()#include #include // Need random(), srandom()#include // Need time()#include // Need sort(), copy()#include // Need vector#include using namespace std;// Display原创 2013-10-31 11:48:21 · 1478 阅读 · 0 评论 -
STL容器之list
list: 双链表,从任何地方快速插入与删除。 数据由若干个节点构成,每一个节点都包括一个信息块、一个前驱指针、一个后驱指针。不使用连续的内存空间这样可以随意地进行动态操作。可以在内部任何位置快速地插入或删除,当然也可以在两端进行push和pop。 不能进行内部的随机访问,不支持[]/vector.at()。 五个构造函数:list c0;//空转载 2013-10-31 14:15:41 · 718 阅读 · 0 评论 -
STL容器之vector
vector: 从后面快速的插入与删除,直接访问任何元素。可以看作动态数组。自动分配一块连续的内存空间进行数据存储。当存储的数据超过分配的空间时,会重新分配一块内存块:首先,会申请一块更大的内存块;然后,将原来的数据拷贝到新的内存块中;其次,销毁掉原内存块中的对象(调用对象的析构函数);最后,将原来的内存空间释放掉。 随机访问方便,支持[]/ve转载 2013-10-31 13:58:58 · 659 阅读 · 0 评论 -
C++ fstream文件读写操作
fstream文件读写操作实例:#include #include #include using namespace std;int main(){ //ios::app: 以追加的方式打开文件 //ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性 //ios::binary: 以二进制方式打开文件,缺省的方式是文本方式 //ios原创 2014-02-12 14:44:24 · 1880 阅读 · 0 评论 -
C++ map中删除一个元素的处理
截取项目中的部分代码: map IOIDModeMap; map::iterator IOModeMapIter; for (IOModeMapIter= IOIDModeMap.begin(); IOModeMapIter!= IOIDModeMap.end(); ) { Log( "[%d]=[%d]",IOModeMapIter->first, IOModeMapI原创 2014-03-10 16:34:23 · 11386 阅读 · 1 评论 -
C++中stringstream实现C中sprintf与atoi功能
目前对C语言的使用比较多,C++ 的经验不是很多。用stringstream 实现 C 中的sprintf 以及atoi函数的方法。#include #include #include #include #include using namespace std;int main(){ int i=24; string name("liukang"); /原创 2014-02-12 15:07:13 · 2392 阅读 · 0 评论 -
类和对象占多少空储空间?
类或者对象的大小可以用sizeof运算符算出,即sizeof(object_name)。可是sizeof(object_name)的值与其成员的大小是什么关系呢,答案是:一个对象的大小>=所有非静态成员大小的总和。 为什么是大于等于而不是正好相等呢?超出的部分主要有以下两方面: 1) C++对象模型本身 对有虚函数的类来说,必须为它的对象提供运行时类型信息(RTTI,R原创 2015-02-09 21:02:50 · 1634 阅读 · 0 评论 -
string转utf8后解决TTS识别中文的问题
今天遇到string字符编码的问题,因为遇到了用TTS将文本转语音的一个API,里面的中文必须是utf8的,我传了一个uncode编码的中文进去,就一直不能正常读出来,后来才发现是编码的问题。这里在网上找到两个API,可将string 传成utf8编码的string,挺好用的。记录下来:std::string string_To_UTF8(const std::string & s原创 2015-06-23 17:54:22 · 1973 阅读 · 1 评论 -
适配器模式(Adapter Pattern)(C++实现)
解决的问题:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。比如说我的hp笔记本,美国产品,人家美国的电压是110V的,而我们中国的电压是220V,要在中国能使用,必须找个变压器转一下电压才可以。这个变压器就是个适配器。适配器模式有类适配器和对象适配器两种模式,我们将分别讨论。类适配器:由图中可以看出,转载 2015-03-19 17:30:39 · 644 阅读 · 0 评论 -
Singleton模式(C++实现)
Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情。1. 标准的实现class Singleton{public: static Singleton * Instance() { if( 0== _instance) {转载 2015-03-19 17:34:23 · 723 阅读 · 0 评论 -
监听者模式(listener)(c++实现)
监听者对大家来说可能并不陌生,所谓监听者就是用来监听自已感兴趣的事件的,当收到自已感兴趣的事件时会做出相应的反映。 它的应用是非常广的,比如win32的消息机制,它跟监听者模式就异曲同工,操作系统将产生的各种事件包装成消息(msg),该消息结构包装了发生的事件的描述信息,比如消息值,屏幕坐标等,然后将它投递到相应的进程中,当该进程收到该消息时会查看该msg结构中的信息,也就知道了发生了什转载 2015-03-19 17:47:07 · 15653 阅读 · 2 评论 -
最简单的单身模式
单身模式是比较常用的一种设计模式,比较简单的实现:static HttpConnect * g_HttpConnect = 0;HttpConnect * HttpConnect::getHttpSingler(){ if (g_HttpConnect == 0) g_HttpConnect = new HttpConnect(); return g_HttpCon原创 2015-08-31 21:32:49 · 1157 阅读 · 0 评论 -
YUV420转RGB的代码(C++/JAVA)
Android中MediaCodec解码出来的是YUV420数据, 转换成RGB的C++代码如下:static uchar pBGR24[MAX_BUF_SIZE];static int Table_fv1[256] = { -180, -179, -177, -176, -174, -173, -172, -170, -169, -167, -166, -165, -163, -162, -160原创 2016-03-10 17:39:37 · 6889 阅读 · 0 评论 -
STL容器之deque
deque : 随机访问方便,即支持[ ] 操作符和vector.at() ,但性能没有vector 好; 可以在内部进行插入和删除操作,但性能不及list ;可以在两端进行push 、pop ;相对于verctor 占用更多的内存。 双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。五个构造函数:deque();//创建一个空双向队列转载 2013-10-31 14:34:56 · 807 阅读 · 0 评论