比如在一個項目中,有大量的資料結構,他們都是雙向鏈表,但又想共用一套對鏈表的操作演算法,這怎麼做到呢,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)
————
(著作權,如需轉載,請註明出處及作者)