免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pan_0326
打印 上一主题 下一主题

Coo - C语言面向对象编程 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2010-06-04 16:17 |只看该作者
回复  fera

这东西我已经下载过2次: 刚出现在cu, 以及回复在那个interface帖后。
结果是(我知道虽然 ...
OwnWaterloo 发表于 2010-06-04 16:07



#define EXTENDS(s) \
    union \
    { \
        s s; \
        s; \
    };
这个宏是核心,借用java关键字extends,继承的意思,实际是嵌入数据.
VTable是建议规范,VT宏是嵌入虚函数表指针规范,其它宏是变体和辅助.

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
32 [报告]
发表于 2010-06-04 17:15 |只看该作者
回复 29# pan_0326

假设程序员A要解决P问题, A对解决这个问题的L库很熟悉。
L库可能就是A自己开发的, 也可能是别人开发的, 总之A很熟悉。

现在有人宣传解决P问题的另一个库N。
如果N没有什么特别明显的好处, 或者说N的宣传没有让A感到有很明显的好处, A会去深入研究并熟悉N, 然后使用N吗?


所以, 如果你想宣传这个东西, 建议把文档写得再详细一些。
比如你提到的第1个, 大小问题, 在我看来这是tradeoff —— 即优化一方面是建立在劣化另一方面的基础上 —— 并不是真正的优化。
所以其他的也就看不下去了, 不够吸引人。


1. C++不一定不具备这样的灵活性。

我不记得C++是否要求基类和子类成员之间在地址上有没有强制顺序。
有可能有强制, 并且有适当的理由。

也有可能没有这种强制, 只是编译器没有利用这个特性。
比如, C++不保证不同access section中的成员有相同的顺序。
理论上说, C++编译器就可以利用这个特性重新安排成员的顺序, 以优化存储。
注意, 这是真正的优化, 并不导致其他方面的劣化。
印象中, 至少gcc和msvc没有采用。

例子在: http://bbs.chinaunix.net/redirec ... 18&pid=12276162


一方面, 连真正可以优化的灵活性, 都不一定被C++编译器采用, 更别说会带来其他方面损失的灵活性。
另一方面, C++编译器不采用, 不能证明C++不具备这样的灵活性。
要证明, 需要查看C++标准确实在这方面有限制: 基类成员必须比子类成员有更低的地址。


2. 为什么这是tradeoff, 而不是optimization

因为子类到基类的转换需要做加法运算。
不以base作为起始, 可能会提高空间效率, 但损失时间效率是肯定的。

论坛徽章:
0
33 [报告]
发表于 2010-06-04 17:51 |只看该作者
回复  pan_0326

假设程序员A要解决P问题, A对解决这个问题的L库很熟悉。
L库可能就是A自己开发的, 也 ...
OwnWaterloo 发表于 2010-06-04 17:15



看你对C++挺熟的,不应该看不懂coo.h,是不愿也,心理作用.
我也不知道C++有没有重排数据的规范,但现实使用的几个编译器都不会.求人不如求己,
等编译器器优化,还不如自己手摆.C和C++程序员研究到深处和java程序员是不同,不仅
要会用,还要知道怎么实现,做到最大控制.gcc编译器的优化总是不如意,靠等能急死,
编码时直接做些优化控制才踏实.
EXTENDS由于语法原因,天生具有手摆的自由.但这也不算什么,Coo本来就不想也不能和
C++比.
Coo在嵌入虚表指针这方面却是很灵活的,C++的多继承只有固定一个套路.
Coo最大的功劳是可以继承、多继承、虚函数、深层引用成员、深层引用基类,这对C来
说已经够了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
34 [报告]
发表于 2010-06-04 20:20 |只看该作者
本帖最后由 OwnWaterloo 于 2010-06-04 20:23 编辑

回复 33# pan_0326

1. 重排基类并不是优化, 而是损失时间效率换空间效率。
关于这个你怎么看?


2. 匿名union
这特性我眼馋很久了, 可惜C99也不支持它, 更别说C89了。
所以, 使用匿名union来实现继承并深层引用成员和基类是自相矛盾

C++才支持匿名union。
但C++从C+++98开始就支持继承(并能深层引用成员和基类), 而且C++编译器支持得还不错。

而C语言中的匿名union, 鬼知道什么编译器支持, 什么编译器不支持。
msvc支持吗? 支持。 但msvc本来就是C++编译器, 至少从VC6开始就是如此。
gcc支持吗?可以通过编译参数支持或者不支持。 但是,去搞个g++的后端就可以用C++了。
与其这样, 我还不如直接使用C++编译器。


所以, 这不是什么COO, 而是dialect C OO、gcc OO。
既然不具备C的可移植性和广泛性, 直接用C++得了。


同时, 用匿名union可以实现继承, 并能较为自然的引用祖先。
但是, 可以用匿名union实现多继承吗?

  1. struct A        { ... };
  2. struct B : A    { ... };
  3. struct C : A    { ... };
  4. struct D : B, C { ... };
复制代码
这也叫多继承。
D可以通过C::A和B::A引用两个不同的A。 匿名union没问题?


3. 关于OO
我对OO并不感冒, 所以对C、OO这种东西一向没兴趣, 因为我对OO没兴趣。

匿名union我也曾经打算用过, 用在类似linux/list.h的东西上。
一个2指针的节点, 既可以当作双链表节点, 也可以当作没有parent指针的二叉树节点, 甚至还可以当作单链表的节点。
我直接就将单指针的节点嵌入到双指针节点中去了, 并不需要什么EXTENDS

一个节点, 如果它有link1成员, 它就可以传递给单链表的函数。
如果它有link2成员, 它就可以传递给双链表和两节点二叉树的函数。
所以, 我不觉得一定需要将双指针节点理解为由单指针节点继承得到才能编程。
我打心眼里就把OO放在很低的优先级里。

非要将它理解为EXTENDS, 用OO去套这种关系, 只能说是学OO学傻了。

最终没有采用匿名union, 理由上面也说了, 是因为这不是任何一个C标准规定的东西


而COO、 去掉这个有可移植性问题, 有效率问题, 有多继承问题, 有问题的EXTENDS之后, 还剩什么?


我用到的C++ OO代码, 我都知道它们的C代码是如何表达的。
以我的经验, 这些C代码中存在的共性根本不是一个EXTENDS就可以表达的。
至少需要VA_ARG, 但我通常只在Clean C下编程, 所以C99的特性一般也是不用的。

本来想写一些代码来说明C++的部分OO代码如何翻译为C, 而这部分的C代码完全不需要EXTENDS。
写到一半放弃了。 感觉你也是个听不进劝的主, 写了也白写。
你继续弄COO好了。

论坛徽章:
0
35 [报告]
发表于 2010-06-04 23:43 |只看该作者
回复  pan_0326

1. 重排基类并不是优化, 而是损失时间效率换空间效率。
关于这个你怎么看?


2.  ...
OwnWaterloo 发表于 2010-06-04 20:20



1.关于成员位置排列,这是深入C/C++必过的关,没有哪个编译器能自动做好.
2.匿名union,几乎所有C编译器都支持.匿名struct,gcc需要靠扩展选项.
  Coo确实使用了C标准的边缘特性,那是因为以前没有这么用的,将来不一定.
3.C++能完成的多继承Coo都能完成,因为你没试过,菱形多继承在Coo中没问题.
尽管是个很糟糕的例子
typedef struct A { ... } A;
typedef struct B { EXTENDS(A) } B;
typedef struct C { EXTENDS(A) } C;
typedef struct D { EXTENDS(B) EXTENDS(C) } D;
D d;
d.A //d.B.A
d.C.A //后出现的A不能跨层书写
4.C++翻译成C是可以的,但几乎无法阅读,用C来直接写更是痛苦.
用Coo可以方便许多,最起码可以用d.A代替麻烦的d.B.A,继承链越长越方便.
5.我并不鼓吹EXTENDS有什么神奇,优点只是插入点随意,跨层(深层)访问的书
写方便.
6.你那么歧视OO,还参与讨论什么interface,直接鄙视就得了.

论坛徽章:
0
36 [报告]
发表于 2010-06-05 10:55 |只看该作者
本帖最后由 pan_0326 于 2010-06-05 12:36 编辑

详解EXTENDS
EXTENDS宏是Coo的核心,借用java的关键字extends,继承扩展的意思,
在Coo中当作"嵌入"更容易理解.它的原始朴素的形态是这样的:
#define EXTENDS(s) s s;
嵌入基类,并且用基类名作为成员名,这是为了记忆访问方便.
typedef struct CBase { int i; } CBase;
typedef struct T1 { EXTENDS(CBase) } T1;
T1 t; //t.CBase t.CBase.i
子类可以访问基类整体t.CBase,很满意;可t.CBase.i就不如C++的t.i
了,继承链越长越麻烦:
typedef struct T2 { EXTENDS(T1) } T2;
...
typedef struct TN { EXTENDS(TN_1) } TN;
TN t;
访问CBase要这么写:t.TN_1....T1.CBase
访问i要这么写:t.TN_1....T1.CBase.i
累死!怎么办?用匿名struct,它的特性就是可以直接访问内层:
#define EXTENDS(s) s;
访问i终于不用一长串了,直接t.i,很好!可无法访问CBase整体了,用强
制类型转换,是个坏主意.用匿名union结合上述两种方法得到最终的版本:
#define EXTENDS(s) \
    union \
    { \
        s s; \
        s; \
    };
这样任何深度的成员都有两种访问方式---跨层和逐层
t.TN_1....T1.CBase和t.TN_1....T1.CBase.i就是逐层,t.CBase和t.i就
是跨层,完美!
最后问题就是编译器支持情况,匿名union虽然不是C标准,但几乎所有的C编
译器都支持,因为它是C++标准.就像//注释先是C++标准,C在没出C99标准前
都纷纷支持一样.
匿名struct呢?C标准允许直接嵌入struct { ... };不许struct CBase;没
道理,gcc加上-fms-extensions选项就支持了.
还有成员重名问题,C标准没说,而许多编译器实现时都允许,这有什么坏处
呢?第一个可访问即可.

论坛徽章:
0
37 [报告]
发表于 2010-06-05 11:08 |只看该作者
楼主把Coo配套的STL和Boost实现一份,我想还是会有人用的。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
38 [报告]
发表于 2010-06-05 11:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
39 [报告]
发表于 2010-06-05 12:05 |只看该作者
楼主把Coo配套的STL和Boost实现一份,我想还是会有人用的。
没本 发表于 2010-06-05 11:08



你把template和OO搞混了,用宏可以模拟些简单的template,
想用boost只能C++

论坛徽章:
0
40 [报告]
发表于 2010-06-05 12:21 |只看该作者
你把template和OO搞混了,用宏可以模拟些简单的template,
想用boost只能C++
pan_0326 发表于 2010-06-05 12:05



    STL实现的主要是容器类,模板只是为了实现泛型容器类的途径之一,STL和Boost容器类并非全是依赖模板的。

本版有人发过C STL  http://libcstl.googlecode.com

ACL 也实现了一些C容器 http://acl.sourceforge.net/

GTK 当然更是有名的跨平台C库

你就一个OO实现,没有库的支持,谁用啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP