锁定老帖子 主题:语言逻辑边界和新手友好
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-10-14
ddd 写道 绝对的封装C也能做到,不过大多数人不掌握而已(还有一种是认为自己可以驾驭无边界,用C嘛,就是用它的灵活),导致很多人恐怕都不知道这个东西。
比如FILE*的用法,你知道FILE是什么东西么? 可以详细讲解? |
|
返回顶楼 | |
发表时间: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达到直接访问成员变量的目的(我就这么干过,自然这个是危险的,不要轻易动用)。 |
|
返回顶楼 | |
发表时间:2006-10-14
这不是照样能看到?
标准的方法是一个handle(一般是地址或者结构数组的索引),或者直接用void * 而且这种方法绝不是什么秘密,99.99%的专属的C API都是这样写的 如果有写用其它语言存取C程序的经验,譬如用Delphi存取BDB,结构异常复杂,完全翻译头文件太麻烦,也往往用这种方式封装的 |
|
返回顶楼 | |
发表时间:2006-10-14
》这不是照样能看到?
你能看到struct ddd的定义么? 》标准的方法是一个handle(一般是地址或者结构数组的索引),或者直接用void * handle是另外一种更高级手法,我不想多说,跟话题无关,因为他不是指针。 你说void*证明你对C的某些非常细节的东西不掌握。 》而且这种方法绝不是什么秘密,99.99%的专属的C API都是这样写的 我也没说是秘密,本来原理就不难,但确实大多数人要么是不掌握,要么是掌握了也不用,以至都成了“高级技巧”了。 |
|
返回顶楼 | |
发表时间: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; } |
|
返回顶楼 | |
发表时间:2006-10-14
》struct ddd{char b; long e;};
加个struct ddd{char b; long e;}; 的话那就是纯粹故意捣乱了。 故意捣乱的话哪个语言都无法避免。 C++如果把成员的private改成public,可以直接访问成员变量,你这是捣乱,没有任何意义。 |
|
返回顶楼 | |
发表时间:2006-10-14
什么叫故意倒乱
你的实现机理就是去掉这个struct类型的检查和约束,这就是你的漏洞,比void*还不如 |
|
返回顶楼 | |
发表时间:2006-10-14
void*?那也是可以指针转化的,想捣乱方法多着呢,按照你的定义,这也是void*的漏洞。
|
|
返回顶楼 | |
发表时间:2006-10-14
至少你不能重新定义void,如果另外一个模块正好也定义了一个struct ddd(就象我给的例子),那该怎么办
本来这个指针就是用来在函数间传递(模拟对象实例)而已,只要是一个指针或者索引而已,我们约定不对它进行任何操作。 |
|
返回顶楼 | |
发表时间:2006-10-14
》至少你不能重新定义void
这和你说的void*方式更好有什么关系。 重新定义struct ddd……本来就和指针强制转化没本质区别。 》我只是觉得你交流的方式很奇怪 虽然跑题了,不过我想听听,自然我很可能不同意你的看法,最后导致互相口水。 |
|
返回顶楼 | |