天天看點

用C寫有面向對象特點的程式

比如在一個項目中,有大量的資料結構,他們都是雙向連結清單,但又想共用一套對連結清單的操作算法,這怎麼做到呢,C中又沒有C++中的繼承,不然我可以繼承一父(類中隻有兩個指針,一個向前一個向後),而其算法可以寫在你類中的虛函數中,供子類使用。如:

class Links

{

public:

    Links* back;

    Links* forword;

    virtual Add(){ ... };

    virtual Del(){ ... };

    virtual Ins(){ ... };

    virtual Print() =0;

    ....

};

于是對于特定的資料結構我們可以:

class mylinks : public Links 

    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後的樣子吧。

本文轉自 haoel 51CTO部落格,原文連結:http://blog.51cto.com/haoel/124717,如需轉載請自行聯系原作者

繼續閱讀