论坛首页 综合技术论坛

语言逻辑边界和新手友好

浏览 26143 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-10-14  
ddd 写道
绝对的封装C也能做到,不过大多数人不掌握而已(还有一种是认为自己可以驾驭无边界,用C嘛,就是用它的灵活),导致很多人恐怕都不知道这个东西。
比如FILE*的用法,你知道FILE是什么东西么?


可以详细讲解?
0 请登录后投票
   发表时间:2006-10-14  
》详细讲解?
讲解谈不上。
举个例子
ddd.h
struct ddd* ddd_create();
void ddd_foo(struct ddd*);
void ddd_destroy(struct ddd*);

ddd.c
#include"ddd.h"
struct ddd{int a;};
...
一堆static函数实现
...
struct ddd* ddd_create(){}
void ddd_foo(struct ddd*){}
void ddd_destroy(struct ddd*){}

...

这样调用者根本看不到struct ddd有什么成员,ddd.c做成库/目标文件以后就可以达到绝对封装的目的。而class是数据函数合二为一,提供函数必然会提供内部成员,这不是绝对的封装,c++程序员可以通过修改.h达到直接访问成员变量的目的(我就这么干过,自然这个是危险的,不要轻易动用)。
0 请登录后投票
   发表时间:2006-10-14  
这不是照样能看到?

标准的方法是一个handle(一般是地址或者结构数组的索引),或者直接用void *

而且这种方法绝不是什么秘密,99.99%的专属的C API都是这样写的

如果有写用其它语言存取C程序的经验,譬如用Delphi存取BDB,结构异常复杂,完全翻译头文件太麻烦,也往往用这种方式封装的
0 请登录后投票
   发表时间:2006-10-14  
》这不是照样能看到?
你能看到struct ddd的定义么?

》标准的方法是一个handle(一般是地址或者结构数组的索引),或者直接用void *
handle是另外一种更高级手法,我不想多说,跟话题无关,因为他不是指针。
你说void*证明你对C的某些非常细节的东西不掌握。

》而且这种方法绝不是什么秘密,99.99%的专属的C API都是这样写的
我也没说是秘密,本来原理就不难,但确实大多数人要么是不掌握,要么是掌握了也不用,以至都成了“高级技巧”了。
0 请登录后投票
   发表时间:2006-10-14  
象你这种交流方法实在是

算了吧,我也不和你多讲了,你自己看看

ddd.h


struct ddd* ddd_create();
void ddd_foo(struct ddd*);
void ddd_destroy(struct ddd*);

ddd.c


#include"ddd.h"
struct ddd{int a;};

struct ddd* ddd_create(){}
void ddd_foo(struct ddd *aaa){}
void ddd_destroy(struct ddd*bbb){}


main.c

#include "ddd.h"
struct ddd{char b; long e;};
int main (int argc, char const* argv[])
{
struct ddd* a = ddd_create();

return 0;
}



0 请登录后投票
   发表时间:2006-10-14  
》struct ddd{char b; long e;};
加个struct ddd{char b; long e;}; 的话那就是纯粹故意捣乱了。
故意捣乱的话哪个语言都无法避免。

C++如果把成员的private改成public,可以直接访问成员变量,你这是捣乱,没有任何意义。
0 请登录后投票
   发表时间:2006-10-14  
什么叫故意倒乱

你的实现机理就是去掉这个struct类型的检查和约束,这就是你的漏洞,比void*还不如

0 请登录后投票
   发表时间:2006-10-14  
void*?那也是可以指针转化的,想捣乱方法多着呢,按照你的定义,这也是void*的漏洞。
0 请登录后投票
   发表时间:2006-10-14  
至少你不能重新定义void,如果另外一个模块正好也定义了一个struct ddd(就象我给的例子),那该怎么办

本来这个指针就是用来在函数间传递(模拟对象实例)而已,只要是一个指针或者索引而已,我们约定不对它进行任何操作。



0 请登录后投票
   发表时间:2006-10-14  
》至少你不能重新定义void
这和你说的void*方式更好有什么关系。

重新定义struct ddd……本来就和指针强制转化没本质区别。

》我只是觉得你交流的方式很奇怪
虽然跑题了,不过我想听听,自然我很可能不同意你的看法,最后导致互相口水。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics