zhangJW_cn 阅读(669) 评论(4)
    自己常用的几种void *的技法,总结一下,大概用三种代表。

    1.实现隐藏:

    不希望暴露数据结构、实现思路时,在头文件里只一个void *的实现体,实现的时候再调用实现体的实现。当然,如果真这么用,最好和内存池结合起来,避免实现体的new/delete内存操作。
.h头文件:
class Sample
{
private:
   void *m_impl;
};

.cpp实现文件:
class SampleImpl
{
private:
...
};


    2.数据注入:

    有些时候,需要将原本和对象本事无关的数据和对象进行关联,通过在对象身上bind一个void *的指针,非常方便和高效(相对通过map或者其它的对应技术而言)。同样的,最好有一个内存池支持会好很多。
class Sample
{
public:
    void bind( void *data );
    void *bind( void );
private:
    void *m_bind;
};


    3.接口简化:

    很多人会对一些底层的内容进行浅封装注1,然后再行操作。在我的实际应用中,大多时候这些浅封装并没有给我带来太多的好处;而且,通常是五花八门、样式繁杂,但实质内容却90%一样。对于做过很长时间上层的我来说,更习惯将封装更面向应用一点,这样一来,底层的能力肯定不能全面暴露出来,真需要时就麻烦了。基于这样的情况,void *成为了选择,对于采用的是浅封装、还是直接底层都可以代表。缺点是扩充者需要知道它真实的涵义(不过,既然要扩充,想不知道扩充的基础底层也不可能)。
通常做法:
#include "./Graphics.h"
class Sample
{
public:
    void draw( Graphics *g );
};

个人做法:
class Sample
{
public:
    void draw( void *g );
};


     备注:
    浅封装:指那种只是将原底层接口换了个名,重先出现的封装。比如:上面的Graphics只是D3D的设备穿了衣、或者DDRAW的Surface改了名、socket的struct化等。

评论列表
oshj
re: void *几用
个人用3 的情况比较多
brent
re: void *几用
还在玩C++语言,你这玩法, 又不是用在导弹导航上...
别人看不懂的代码,都不是好代码,分数为0

int sub(any) { any; return TRUE;}
(void)sub(any);

清风雨
re: void *几用
to oshj:
最近才悟道这个用法,没想到你都用了很多了。

to brent:
不是为了玩才玩,这里每种用法在特定的情况下,都有他相应的好处。不过,我是做为自己记录的,指不定什么时候就忘记了,还可以这么用。
1. 可以使得头文件简单,而且出于实现保密的需要,还是很有用处的。
2. 很多时候对象本身应该简洁,但往往应对不同的需要,通常需要数据对应。举个例子,比如玩家在哪个房间,在哪个房间最好不要直接记在玩家身上,用数据注入的方式,能够很快的获得该信息。
3. 因为是做为库暴露头文件的,使用者并不关心void *的实际意义,而且能够加快编译速度。真正要关心时,就Graphics.h这个头文件是不够的,通常会需要了解整底层个实现,才能较好的扩充。
陈刚
re: void *几用
class Sample
{
public:
    void draw( void *g );
};

我个人其实并不太认同这种做法,虽然实现了抽象但会加大维护代价

发表评论
切换编辑模式