用C写有面向对象特点的程序

原创 2003年04月02日 09:02:00

比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C++中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后),而其算法可以写在你类中的虚函数中,供子类使用。如:

class Links
{
public:
    Links* back;
    Links* forword;

    virtual Add(){ ... };
    virtual Del(){ ... };
    virtual Ins(){ ... };
    virtual Print() =0;
    ....

};

于是对于特定的数据结构我们可以:
class mylinks : public Links
{
public:
    char* myname;
    char sex;
    int  age;
    ...
    virtual Print(){ .... }

};
对其操作时都可以使用你类的泛型算法。


在C中,该如何做呢?我们用C中的指针和强制类型转可以做到。

下面是我总结出来的一个小的程序,体现了用指针的弹性来实现这一继承的效果:
(我在Liniux下的GCC调试通过)

=======================================

#include <stdio.h>

/* 双向链表 (类似于父类)*/
typedef struct hLinks{
   struct hLinks *bwLink;
   struct hLinks *fwLink;
} hLinks;


/*
 * 一个使用双向链表的结构
 *     (类似于子类)
 */

typedef struct hEnt{
   hLinks links;
   int hData;
   char key[10];
} hEnt;


/*
 *  双向链插入泛型算法 (类似于父数中的成员函数)
 */

Insert( hLinks* elem, hLinks *dest )
{
   if ( !elem || !dest ) return;

   elem->bwLink = dest->bwLink;
   elem->fwLink = dest;
   dest->bwLink->fwLink = elem;
   dest->bwLink = elem;
}


/*
 *  打印 (类似于子类重载父类的成员函数)
 */

PrintLink( hLinks *h )
{
    hEnt *p ;

    for( p = ( hEnt* ) h->fwLink;     /*  <-----------把hLink再转回来  */
         p != ( hEnt* ) h;
         p = ( hEnt* )( (hLinks*)p )->fwLink )
    {
       printf("hData=[%d], key=[%s]/n", p->hData, p->key);
    }
}

 

main()
{
   hLinks head;
   hEnt a[4];
   int i;

   head.bwLink = &head;
   head.fwLink = &head;

   for(i=0;i<4;i++)
   {
      a[i].hData = i*10;
      sprintf(a[i].key,"id=%d", i);

      /*  使用泛型算法构造双向链  */ 
      Insert( (hLinks *) &a[i], (hLinks *) &head ); /*   <-----注意这个强制转换  */
   }

   PrintLink( (hLinks *) &head ); /*   <-------也注意这个强制转换  */
}

其实,C++就是把C++翻译成C,再编译,所以编译好慢。我这里的这个动作可能类似C++转成C后的样子吧。大家多交流(litmouse@km169.net

————
(版权所有,如需转载,请注明出处及作者)

如何在C语言里实现“面向对象编程”

有人认为面向对象是C++/Java这种高级语言的专利,实际不是这样,面向对象作为一种设计方法,是不限制语言的。只能说,用C++/Java这种语法来实现面向对象会更容易、更自然一些。 在本节中,就展示如...
  • iamshaofa
  • iamshaofa
  • 2015年03月12日 15:36
  • 3213

面向对象的C写法

typedef struct _udp_connect_interface_t {     /* 初始化UDP套接字     * @proxy_ip...
  • kelsel
  • kelsel
  • 2016年10月08日 17:08
  • 102

一段js面向对象的写法

var PaperListPage = {}; PaperListPage.TimeOutID = null; PaperListPage.REPORTTYPE = 2 ; PaperListPage...
  • jianfpeng241241
  • jianfpeng241241
  • 2017年02月09日 09:09
  • 529

写给新人的面向对象的基本思维

个人接触编程的时间也5年了,全职写代码的时间差不多也有近3年了,但这段时间走了很多弯路,一是因为身边没有经验丰富的开发者,二是很少接触程序设计方法论方面的知识。导致我看文档写代码能力是提高了,但设计能...
  • qq_35064774
  • qq_35064774
  • 2016年07月12日 09:31
  • 1656

如何在C语言里实现“面向对象编程”

有人认为面向对象是C++/Java这种高级语言的专利,实际不是这样,面向对象作为一种设计方法,是不限制语言的。只能说,用C++/Java这种语法来实现面向对象会更容易、更自然一些。 在本节中,就展示如...
  • iamshaofa
  • iamshaofa
  • 2015年03月12日 15:36
  • 3213

面向对象程序设计与基本特征

程序设计的本质是把人们在现实生活中遇到的问题通过抽象处理,利用编程语言转换到计算机能够理解的层面上去。程序设计从开始到现在,大致经历了过程式程序设计、结构化程序设计和面向对象设计3个阶段。     ...
  • ma_hoking
  • ma_hoking
  • 2015年04月27日 22:10
  • 1854

讲解JavaScript的面向对象的编程

  • 2008年11月28日 21:58
  • 10KB
  • 下载

使用C语言进行面向对象的开发--GObject入门[1]

转自:blog.csdn.net/pingf0 或www.cnblogs.com/pingf“ C语言是简单的,因为它本身并没有什么特别的内容,标准C并没有提供多少函式(其实一般用不到的提供...
  • yanbixing123
  • yanbixing123
  • 2016年10月18日 13:07
  • 511

什么是对象?什么是面向对象程序设计?面向对象语言有什么优点?

在计算机科学中,对象(英语:object),台湾译作物件,是一个存储器地址,其中拥有值,这个地址可能有标识符指向此处。对象可以是一个变量,一个数据结构,或是一个函数。是面向对象(Object Orie...
  • u012843100
  • u012843100
  • 2017年03月01日 15:03
  • 5957

C 面向对象课程设计报告(局域网聊天程序)

  • 2012年05月16日 16:21
  • 343KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C写有面向对象特点的程序
举报原因:
原因补充:

(最多只允许输入30个字)