对于高手,以及有着良好C语言风格的程序员来讲,我这里属于是班门弄斧了。C++面向对象中有个很重要的特性是封装,之前一直很忽视封装,可现在渐渐的开始注意到封装的作用。其实一样语言,了解其特性,把握其中的使用技巧,你会比别人更快的掌握。
大家都知道MFC是C++的一种封装,这是一个很优秀的封装结果,但是封装有个局限,如果要适应所用场合,那会显得很臃肿如果封装的有特色,灵活,那会紧紧适用部分场合。我个人觉得,良好的封装应该具有较强的针对性。
我就介绍下一些宏是使用吧,很多win32的代码里都会有SAFE_DELETE() 这个宏,其实源码就是#define SAFE_DELETE(p) if(!p)\
{\
delete p;\
p = NULL;\
}\在使用MFC时 ,有许多的MAP_BEGIN,MAP_END,其实呢这就是一个switch语句!你可也可以封装!
#define BEGIN_CREATE_PDU if ( pDoc == NULL )\
return NULL;\
switch( pDoc->CmdCode() )\
{#define ON_CREATE_PDU(X, Y, Z)  case X:\
{\
Y * pPDU = NULL;\
pPDU = new Y(pDoc);\
if ( pPDU == NULL  )\
return NULL;\
else if ( pPDU->m_ErrorNo != RESULT_CODE_SUCCESS) \
{\
delete pPDU;\
return NULL;\
}\
return (Z*)pPDU;\
}\
break;#define END_CREATE_PDU default:\
{\
return NULL;\
}\
break;\
}
使用效果:
BEGIN_CREATE_PDU
ON_CREATE_PDU(MSG_TYPE_REGISTER, CRegister, IRequestPDU)
ON_CREATE_PDU(MSG_TYPE_KEEPALIVE, CKeepAlive, IRequestPDU) END_CREATE_PDU(CInvalidPacket, IRequestPDU)
编程的时候会有许多的一些小技巧,如果懂得其中,你会发现封装的乐趣,之前我很热衷网络编程的各种模型,后来当你试着去封装一个网络模块,试着去做同步转异步,会发现,虽然你的模型没有IOCP那么优秀,但是在某种特定场合,同样能去良好的使用,也会有不错的满足感。
抛砖引玉,促进交流~

解决方案 »

  1.   

    LZ,貌似这些例子是宏,不是面向对象的封装(encapsulation)
      

  2.   

    怎么突然崩出一句 iocp  = =!
      

  3.   

    封装的含义不应该仅仅是oop里的概念的,
    在做底层库的时候,为了方便上层使用,我们会用几个(底层api+容器+线程+锁)进行一层层的逻辑封装,以此提供给上层使用。
    好比在提到队列时,如果想起的仅仅是stl中的queue或者deque,这样的思想我觉得会比较的局限,
    有时候,在特定场合完全一个数组+3个标示就能形成一个队列,我的观点是,封装的越完善,说明考虑的越全面,也就意味着架构越是复杂化,如果一个大项目,
    都是这样方式的封装,不是很有效的方式。
      

  4.   


    LZ取笑了LZ能脱离束缚站在更高的层次看问题,这眼界这思想比偶高多了
      

  5.   

    看到IOCP 我觉得楼主不了解 什么是 封装 看到楼主回复啥容器 锁我敢肯定了!
      

  6.   

    你的那个 SAFE_DELETE 不是很 safe 吧,要是 delete 一个 int *p = new int[32] 怎么办?
      

  7.   


    只是举例,很多SAMPLE里都有SAFE_DeleteArray,可以delete[].C++中不怎么提倡使用宏,但是一些技巧,还是很高效的,设计的思路也非常的灵活!比如##的使用,虽然封装的过程难看懂,但封装后使用的便捷才是最吸引人的。