免费注册 查看新帖 |

Chinaunix

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

用C实现面向对象。 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-08-19 23:01 |只看该作者
原帖由 waternie 于 2008-8-19 19:41 发表
上面很多都说了,关键是要有 OO 的思想。不要拘泥于它是怎么实现。
只要对自己负全责,就是对象
只要将自己完全封装,就是类。
很多实现都是人为加上去的,而且OO本来就是就是一种思想,本质。


恩 还有另一个途径
就是用c实现一个c++编译器 然后使用c++的class关键字
这何尝不是用c实现了面向对象

论坛徽章:
0
22 [报告]
发表于 2008-08-20 13:26 |只看该作者
用C实现面向对象

没必要

论坛徽章:
0
23 [报告]
发表于 2008-08-28 19:43 |只看该作者
原帖由 waternie 于 2008-8-19 19:41 发表
上面很多都说了,关键是要有 OO 的思想。不要拘泥于它是怎么实现。
只要对自己负全责,就是对象
只要将自己完全封装,就是类。
很多实现都是人为加上去的,而且OO本来就是就是一种思想,本质。

很精辟

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
24 [报告]
发表于 2008-08-28 19:55 |只看该作者
原帖由 mailisall 于 2008-5-23 13:47 发表
今天看精华贴的时候,发现了这样个帖子关于用C实现面向对象(发起人:zhujiang73 (zhujiang)
精灵王),不知道有没有这风面的资料。
我猜想用C实现面向对象,应该离不开名字空间,也离不开表。
用名字空间隔离 ...



>>  今天看精华贴的时候,发现了这样个帖子关于用C实现面向对象(发起人:zhujiang73 (zhujiang)
精灵王)

我哪个帖子进精华了,我怎么不知道。

这个?

http://bbs.chinaunix.net/viewthread.php?tid=1153078

用一组数据结构(CInfo)保存对象的类型信息,然后需要访问继承来的成员时,根据 CInfo  中记录的类型信息用 get_parent 找到它们。
菱形继承:

#include <stdio.h>

#pragma pack(1)

#define  SIZETAB   6

#define  A_ID   1001
#define  B_ID   1002
#define  C_ID   1003
#define  D_ID   1004

typedef struct
{
    int  id;
    int  madd;   
} CInfo;

typedef struct
{  
    int  ma;
} A;

typedef struct
{
    A    parent;
    int  mb;
} B;

typedef struct
{
    A    parent;
    int  mc;
} C;

typedef struct
{
    CInfo  citab[SIZETAB];
    B      parent01;
    C      parent02;
    int    md;
} D;

void*  get_parent(void *this,  int  id_parent)
{
    void   *pp;
    CInfo  *pc;
   
    pp = 0;
   
    pc = (CInfo*)this;

    int  i;

    for (i=0; i<SIZETAB; i++)
    {
        if (pc->id == 0) break;
        if (pc->id == id_parent)
        {
            pp = this + pc->madd;
            break;   
        }
        pc++;
    }

    return  pp;     
}

void  D_init(void  *this)
{
    CInfo  *pc = (CInfo*)this;
    pc->id = A_ID;
    pc->madd = sizeof(CInfo)*SIZETAB;
    pc++;
    pc->id = B_ID;
    pc->madd = sizeof(CInfo)*SIZETAB;
    pc++;
    pc->id = C_ID;
    pc->madd = sizeof(CInfo)*SIZETAB + sizeof(B);
    pc++;
    pc->id = 0;
}

int main (int argc, char *argv[])
{
    D   d;
        A   *pa;
        B   *pb;
        C   *pc;
        D   *pd;
            
    void  *pp;

        pd = &d;

    D_init((void*)pd);

    pp = get_parent((void*)pd, A_ID);
    pa = (A*)pp;
    pa->ma = 10;
   
    pp = get_parent((void*)pd, B_ID);
    pb = (B*)pp;
    pb->mb = 20;
   
    pp = get_parent((void*)pd, C_ID);
    pc = (C*)pp;
    pc->mc = 30;
   
    pd->md = 40;

        printf("  d.ma = %d \n  d.mb = %d \n  d.mc = %d \n  d.md = %d \n", d.parent01.parent.ma, d.parent01.mb, d.parent02.mc, d.md);

        return  0;
}


[ 本帖最后由 zhujiang73 于 2008-8-29 09:10 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2008-08-28 20:55 |只看该作者

回复 #24 zhujiang73 的帖子

用C面向对象我很感兴趣呀,讲讲你怎么做的呀?

论坛徽章:
0
26 [报告]
发表于 2008-08-28 21:04 |只看该作者
原帖由 cpmpfgh 于 2008-8-28 20:55 发表
回复 #24 zhujiang73 的帖子

用C面向对象我很感兴趣呀,讲讲你怎么做的呀?


他那个也太简单了吧。

论坛徽章:
0
27 [报告]
发表于 2008-08-28 21:14 |只看该作者

回复 #24 zhujiang73 的帖子

嗯,加个注释啥的,也比光着强。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
28 [报告]
发表于 2008-08-29 09:25 |只看该作者
原帖由 cpmpfgh 于 2008-8-28 20:55 发表
用C面向对象我很感兴趣呀,讲讲你怎么做的呀?


用一组数据结构(CInfo)保存对象的类型信息,然后需要访问继承来的成员时,根据 CInfo  中记录的类型信息用 get_parent 找到它们。
这只是一个很简单的例子,实用的系统要复杂的多,不过这个例子有助于对 C 面向对象的理解。

实用的系统可以看看 GObject:

http://library.gnome.org/devel/gobject/unstable/index.html

http://www.ibm.com/developerworks/cn/linux/l-gobject/index.html
简单的说,GObject对象系统是一个建立在GLIB基础上的,用C语言完成的,具有跨平台特色的、灵活的、可扩展的、非常容易映射到其它语言的面向对象的框架。如果你是一个C语言的执着的追随者,你没有理由不研究一下它。

论坛徽章:
0
29 [报告]
发表于 2008-08-29 09:26 |只看该作者
网上资料也很多

论坛徽章:
0
30 [报告]
发表于 2008-08-29 09:32 |只看该作者

回复 #2 mailisall 的帖子

有了C++,C也不能丢,就和BASIC一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP