比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,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)
————(版权所有,如需转载,请注明出处及作者)