C++探索
文章平均质量分 68
chenyu2202863
这个作者很懒,什么都没留下…
展开
-
又一个lua与C++粘合层框架
背景:这是之前那篇烂文章的一个扩展吧!在游戏领域,特别多的使用到lua,作为C++的补充,当然会用到lua与C++的交互。lua提供了与C++交互的API,但是这些API各种坑爹、各种坑,各种繁琐,有的API操作了lua栈,有的却没有。为了解决lua原生API的问题,就出现了一些框架、库来改善,比如lua++,luabind…,窃以为,luabind是史上最强大的lua与C++粘合层,无出原创 2013-09-19 11:51:19 · 6544 阅读 · 2 评论 -
C++二进制兼容性
学习、工作中总结的条款,不喜勿扰~由于标准委员会一直没有统一标准的C++ ABI,导致各个厂商都有自己的一套体系,为了不出意外,循规蹈矩也有一定的必要,但可以斟酌,三思而后行。能:1. 可以添加非virtual函数2. 可以添加enum到class3. 可以追加enum值到已存在enum中4. 可以去掉private限制符没有被inline函数调用或者被使用的且原创 2012-02-29 09:53:14 · 2420 阅读 · 0 评论 -
共享Windows下C++库之线程池篇二
惭愧,很久没有来写点或者共享点有用的代码了,一来是工作很忙,二来也是自己懒惰。借今天国庆放假最后一天在家,把自己前段时间积累的点滴放在这里,以飨大家,如有不合胃口,那就唾之~。在上一篇中,我介绍了一种线程池实现方式(利用系统提供的线程池API)。在这里,我介绍一个自己实现的线原创 2011-10-07 16:21:22 · 3302 阅读 · 0 评论 -
共享Windows下C++库之序列化组件
简介:什么是序列化?简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻松地存储和传输数据。对象序列化反序列化通常用于:1. 将对象存储于硬盘上2. 在网络上传送对象的字节序原创 2011-10-16 22:34:40 · 2453 阅读 · 1 评论 -
字符串格式化大比拼
在平常的编程过程中,总免不了格式化字符串。而作为C++程序员,是快乐的也是痛苦不的。快乐是因为我们有多种方式来达到目的,痛苦也是因为有多种方式而难以决策,总是在思索效率与优雅!C++逐步“沦落”的原因也正是因为她的高贵的气质(难以驾驭),时尚的发型(模板),狂野的性格(内存)。哎,迷恋它,她就是我的传说!先给出一张表格,然后再来一一琢磨! sprintfsnprintf原创 2009-12-18 13:51:00 · 3716 阅读 · 2 评论 -
突破访问权限
我们在写代码的时候,按约定都是把成员数据放到private访问区中,然后在通过相应的函数来存取。那又有什么样的代码可以突破访问权限来直接操作类中private区段中的成员数据呢?首先,我们想到了指针,对吧~指针可是万能之王,然而也是万恶之源。那我们就先来看看指针如何突破马其诺防线的。先定义一个测试类class X{private: int m_nPrivate;public:原创 2009-12-20 13:36:00 · 3675 阅读 · 3 评论 -
STL Tutorial Reference 读后总结
把平常经常遇到,但是又没掌握的STL技术摘录下来,希望在以后能方便的索引。解决两个空容器之间复制时空间问题:listint> m_List;vectorint> m_Vector;for(int i=0; i{ m_List.push_back(i);}copy(m_List.begin(),m_List.end(),m_Vector.begi原创 2008-12-15 15:26:00 · 1078 阅读 · 0 评论 -
共享Windows下C++库之异步http组件
简介最近在做一个crawler,为了更好的发挥抓取web的能力,需要用到异步http。其中DNS解析、下载都需要异步。 本组件基于WinHTTP实现,如果以后有需要再从头构造轮子吧(基于iocp的异步框架)。对于WinHTTP的思想,MSDN很多介绍,这里,这里说明该组件使用十分简单,只需要完成几种回调接口即可1. 完成HTTP HEADER2. 完成HTTP 整个原创 2012-06-05 11:11:35 · 5613 阅读 · 7 评论 -
自己玩垂直搜索
前言由于业余爱好,想折腾一个垂直搜索引擎来玩玩,一方面想搞明白这里的水有多深(确实很深),另一方面满足自己的需要,去博客园,CSDN怕一些好文章来把玩把玩。从断断续续的玩了一个月的情况来看,有些成果,但是技术难点还在后见面。我也会不间断的补充完善,估计至少还需要1年的时间吧。如果你也希望能和我一起探索,请锁定本系列。但是你也无可避免的会和我一起走许多弯路(哈哈,被坑了吧),但是我所走的捷径原创 2012-06-27 13:53:05 · 1714 阅读 · 0 评论 -
Object Pool(C++11)
这是一个简单易用的对象池,很多系统对资源的访问快捷性及可预测性有严格要求,列入包括网络连接、对象实例、线程和内存。而且还要求解决方案可扩展,能应付存在大量资源的情形。object pool针对特定类型的对象循环利用,这些对象要么创建开销巨大,要么可创建的数量有限。而且在pool中的对象需要做到无状态。 如何使用utility::object_pool_tint> pool1原创 2013-09-19 13:43:55 · 4254 阅读 · 0 评论 -
网络库的设计与实现
前言距离第一次发布iocpframework已经三年多了,这期间这款基于windows的网络库经过多次的修改,已经和第一版有非常大的区别了,但是整体思想架构并没有改变,这得益于当初对下载调度器的认识--模块应该是可替换的,这也是后话了。 在阅读本文的时候,希望你能有以下的基础:熟悉C++11 ,auto、decltype、lambda、type_traits、move等原创 2013-09-28 14:23:53 · 8462 阅读 · 10 评论 -
C++接口导出到lua组件
玩过lua的朋友肯定知道,C++要导出接口道lua里其实挺费事儿的,需要考虑lua调用C++后,栈如何弹出相应类型的参数,如何把C++的返回值压入lua栈。最麻烦,不省心且容易出错的就是导出一个接口就需要写一堆破代码。lua++?luabind?好吧,就当你们没用过!看看下面的接口,也就是你需要写的代码,如果觉得还行,下载下来一起讨论吧,你觉得呢? 这是注册时用的,st原创 2013-05-28 16:47:02 · 2349 阅读 · 0 评论 -
当std::ref遇到前置声明
当std::ref遇到前置声明话说,起因是这样的:有一个前置声明的类型然后又一个回调函数使用了一个session_t的引用(注意,在下面这段代码能编译通过)在这里,handler_(session,…)可以看成是一个std::function的对象,而handler的原型是[](network::session_t &, …){};在这里handler_只需要把sess原创 2013-05-14 09:32:12 · 2745 阅读 · 0 评论 -
C++11各种资源及个人见解
本文是专门针对C++新特性的见解,融合自己学习使用过程中的各种曲折。当然,如果你是反C++联盟或者各种逆反党人士均可以跳过 。其中,肯定有许多不恰当的地方,有很多偏见,但还望各位看官秉持该打就打,该喷就喷的原则,看不惯就就拍吧!首先,我力图以一种分类形式展现,把语言特性、库和各种最佳实践、Idiom方法介绍给大家。这里是关于C++11的一个资源清单,如果大家原创 2013-01-31 09:47:48 · 1880 阅读 · 0 评论 -
数据库粘合层--基于protobuffer
背景:最近在工作中,受到大量数据库操作的折磨。由于采用拼接字符串的方式来进行数据库操作,带来了每个数据库操作业务都需要提供一个接口,导致同一张表的操作需要一堆堆接口。比如表person_t有3个字段(age、name、sex),如果对age和sex做update,需要一个接口,如果对age的update那又需要一个接口,对name的update还需要一个字段。这种接口会根据业务不断衍生出来原创 2013-03-05 14:14:03 · 6450 阅读 · 9 评论 -
数据结果集的一种透传解决方法
一、背景很多同学都经历过这样一个应用环境:服务器把客户机的数据请求通过查询数据库得到了结果集,再把结果集返还给客户端。在这里,为了让服务器对客户端数据请求具有更方便的扩展或者收缩,需要让服务器不知道客户端每次返回的数据结果集格式。那如何才能让服务器在不知道客户端请求数据集格式的情况下还能扩展呢,也就是透明的二进制格式呢?想想,就是让查询的结果数据集进行序列化为一种通用格式,然后原创 2012-12-16 14:05:27 · 1982 阅读 · 0 评论 -
从operator<<谈函数重载决议
一. 背景项目中需要对数据库查询访问的业务,在写数据库sql语句代码时,由于没有特别复杂的格式化需求,决定采用C++标准库中的stream来进行sql语句的格式化。有两点好处:1). 类型安全2). 使用方便比如 std::ostringstream os;std::uint32_t id = 10;os "select * from user_t where id原创 2012-12-10 10:32:48 · 1991 阅读 · 0 评论 -
C++异常和SEH的结合
Structured Exception Handling(简称SEH)。在那时我就说过,SEH是window及其平台上的编译器专有的。它不是定义在ISO C++标准中的,使用它的程序将不能跨编译器移植。因为我注重于标准兼容和可移植性,所以我对将windows专有的SEH映射为ISO标准C++的exception handing(简称EH)很感兴趣。 同时,我不是SEH的专家。对转载 2008-11-09 11:44:00 · 10108 阅读 · 0 评论 -
运行时类型识别
前言:当仅有一个指针或引用指向基类型时,利用运行时类型识别(RTTI)可以找到一个对象的动态类型。由于继承的层次结构的典型描述是基类在派生类之上,所以这种类型转换也称为向下类型转换. #ifndef __SECURITY_H #define __SECURITY_H #include using namespace std;原创 2008-11-08 22:36:00 · 1788 阅读 · 0 评论 -
派生类中隐藏基类的虚拟重载函数--从名字空间看待 隐藏
类成员的重载 覆盖和隐藏或许是许多朋友都没彻底明白的语法,在这里,我们试着通过名字空间的解析来理解派生类中隐藏基类的虚拟重载函数.先来看一个例子:#include class B {private: int nNumber;public: virtual void test() { cout virtual void test(int x)原创 2008-06-24 09:07:00 · 898 阅读 · 0 评论 -
读书笔记--继承
对类所继承的成员的访问由基类中的成员访问级别和派生类派生到列表中使用的访问标号共同控制。 公用继承:基类成员保持自己的访问级别,基类的publci成员为派生类的public,protected,private成员均未改变。 保护继承:基类的public和protected成员在派生类中为protected成员 私有继承:基类的所有成员在派生类中为private成员class Base{原创 2007-04-03 19:49:00 · 761 阅读 · 0 评论 -
读书笔记--基本类型和派生类型之间的转换
可以从派生类类型到基本类类型引用的转换,却没有基类到派生类类型引用的转换。编译器不会将派生类对象转换为基类对象转换为基类对象。引用转换不同于转换对象。 Item_base item; //object of base type Bulk_item bulk; //object of derived type //ok:uses Item_b原创 2007-04-01 22:37:00 · 863 阅读 · 0 评论 -
文件流的控制
前天突然有个想法,想把自己(源文件里的代码输出到控制台),于是就写了个初步的代码,如下:#include #include #include using namespace std;int main(void){ ifstream in("2_3.cpp"); //该源文件的名字 string word; //该源文件所含单词个原创 2007-06-27 21:00:00 · 1053 阅读 · 0 评论 -
读书笔记--虚函数与派生类
virtual可以在除了构造函数,任意非static成员函数都可以成为虚函数,virtual的目的是启用动态邦定,成员默认为非虚函数。。virtual只在类内部成员函数声明中出现,不能在类定义体外部出现的函数定义上。 派生类一般会重定义所继承的虚函数,如果没有重定义,则使用基类中定义的版本。派生类中的虚函数可以返回基类函数所返回类型的引用或指针。 用作基类的类必须是已定义的:class原创 2007-04-01 18:49:00 · 840 阅读 · 0 评论 -
读书笔记--调用操作符和函数对象
可以为类类型的对象重载函数调用操作符,一般为表示操作的类重载调用操作符。class AbsInt{ public: int operator()(int val) { return val }};int i=-42;AbsInt absint;unsigned int ni=absint(i); //calls AbsInt::operator(int)定义了一个操作:原创 2007-04-01 17:02:00 · 876 阅读 · 1 评论 -
读书笔记--抑制构造函数定义隐式转换
可以通过将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数。explicit关键字只能用于类的内部构造函数声明上,在类的定义体外不再重复class Sales_item{ public: Sales_item(const string &book=""):isbn(book),units.sold(0),revenue(0.0){}};string null_bo原创 2007-03-20 23:07:00 · 840 阅读 · 0 评论 -
读书笔记--C++文件操作
在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,在头文件中定义 一、打开文件 fstream类的成员函数open(),原形:void open(const char *filename,int mode,int access)filename:打开的文件名字 mode:打开文件的方式 acce原创 2007-03-15 11:44:00 · 830 阅读 · 0 评论 -
读书笔记--resiz capacity和reserve
capacity:获取在容器需要分配更多的存储空间之前能够存储的元素总和reserve:告诉容器(vector)应该预留多少个元素存储空间resize:改变容器所包含的元素个数,如果当前的容器长度小于新的长度值.则该容器后部的元素会被删除;如果当前容器长度小于新的长度值,则系统回在该容器后部添加新元素.resize可能会使容器迭代器失效,如果压缩了容器,则指向已删除的元素的迭代器失效list原创 2007-03-13 11:02:00 · 840 阅读 · 0 评论 -
读书笔记--构造函数和复制控制
构造函数和复制控制成员不能继承,每个类定义自己的构造函数和复制控制成员,如果不自己定义,就将编译器自动合成。如果类需要只希望派生类使用的特殊构造函数,这样的构造函数应定义为protected。 派生类的合成默认构造函数的初始化时:1.先调用派生类上一级的默认构造函数初始化2.然后初始化本垒的数据成员class Bulk_item:public Item_base{ public: Bu原创 2007-04-06 12:14:00 · 948 阅读 · 0 评论 -
读书笔记--模板(1)
函数模板时独立于子类型的函数,可作为一种方式。产生函数的特定类型版本,使用函数模板时,编译器会推断那个模板实参,一旦编译器确定了实际的模板实参,就称它实例了函数模板的一个实例。 inline 说明符放在模板形参表之后,返回类型之前。template inline T Min(const T&,const T&); //OKinline template T Min(const T&,c原创 2007-04-11 22:11:00 · 1525 阅读 · 0 评论 -
浅析CRT--Debug模式下的内存管理(翻译 作者:Marius Bancila )
前言: 当你编译处于Debug模式下的Visual Studio的程序时候,你会发现申请或销毁的内存具有奇怪的值,比如:0xCDCDCDCD或者0xDDDDDDDD.这是为在Win32平台下对内存的保护,防止泄露的措施。在这里,我将介绍完成内存的申请和销毁的new/delete和malloc/free.原创 2008-06-17 09:23:00 · 3578 阅读 · 4 评论 -
读书笔记--异常处理(4)
异常说明: 不能确定函数是否跑出异常及抛出哪种异常,则用异常说明。void recoup(int) throw(runtine_error); 空列表指出寒暑不跑出任何异常void no_problem() throw(); 如果函数跑出了没有异常说明中列出的异常,调用库函数unexpected.默认情况下,unexpected函数调用terminate函数,终止程序 异常说明于虚函数:原创 2007-06-13 22:44:00 · 993 阅读 · 0 评论 -
读书笔记--异常处理(3)
exception类所以定义的唯一操作是一个what的虚成员,返回const char 的对象,一般返回用来在抛出位置构造异常对象的信息 |---overflow_error |--runtime_error---|---underflow_原创 2007-06-09 13:13:00 · 884 阅读 · 0 评论 -
读书笔记--异常处理(2)
栈展开 析构函数应该从不抛出异常,栈为某个异常进行栈展开的时候,析构函数如果抛出自己的末尾处理的另一个异常,会导致调用标准库terminal函数,该函数将调用abort函数,强退。 析构函数经常会抛出异常,类似的,初始化数组或容器类型的元素时,也可能发生异常,如果一场对象找不到匹配的catch,则调用terminal 捕获异常 catch子句中的一场说明符看起来像只包含一个形参原创 2007-06-03 20:52:00 · 765 阅读 · 0 评论 -
读书笔记--异常处理(1)
C++的异常处理中,需要有问题检测部分抛出一个对象给处理代码:通过这个对象的类型和内容,两个部分能够就处了什么错误而进行通信。Sales_item operator+(const Sales_item &lhs,const Sales_item &rhs){ if( !lhs.same_isbn(rhs) ){ throw runtime_error("Dat原创 2007-05-27 19:54:00 · 895 阅读 · 0 评论 -
读书笔记--模版(4)
模板特化:templateint Compare(const T&v1,const T &v2){ if( v1 { return -1; } if( v2 { return 1; } return 0;}如果用两个const char *实参调用这个模板定义,函数将比较指针值,结果使指针在内存中的相对位置templateint Compare(const char * const &原创 2007-05-20 19:09:00 · 1251 阅读 · 0 评论 -
读书笔记--模板(3)
成员模板:成员模板不能为虚templateclass Queue{ public: template Queue(It beg,It end):head(0),tail(0) { Copy_elem(beg,end); } template void assign(Iter,Iter); private: template void Copy_elem(I原创 2007-05-13 12:29:00 · 991 阅读 · 0 评论 -
读书笔记--模板(2)
模板的编译模型: 应该将类定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。要进行模板的实例化,便一起必须能访问定义模板的源代码。 1、包含编译模型//utlities.h#ifndef UTLITIES_H#define UTLITIES_Htemplate int compare(const T&,const T&);#include "utilites.c"#en原创 2007-05-07 20:01:00 · 1182 阅读 · 0 评论 -
读书笔记--static类成员
static数据成员独立于该类的任意对象存在,每个数据成员是与该类关联的对象,并不是与该类的对象相关联. 例如,static数据成员的类型可以是该成员所属的类类型,非static成员被限定声明为其自身类对象的指针或引用.class Bar{ private: static Bar men1;//OK Bar *men2;//OK Bar men3;//error}; sta原创 2007-03-12 22:30:00 · 1019 阅读 · 0 评论