借助OOC-GCC,用面向對象的編程風格進行C語言的開發(仍是純C,輔助代碼借助有限的宏來簡化),頭文件請參見 /p/ooc-gcc,本例子通過實現壹個Animal類及其派生的Cat和Dog類,展現了用C語言模擬繼承與多態的能力.
另付了壹段CPP對比代碼,在不計算註釋保持合理換行的情況下,這個程序的實現OOC-GCC只比C++多了20多行,但是細節上,卻更加靈活,比如類的構造和析構是可控的.同時底層代碼可見,宏本身所做的工作是可見的.
另外OOC-GCC無需任何初始化的代碼,只需引入"OOStd.h"頭文件而已.
標簽: OOC GCC c MinGw OOC-GCC
代碼片段(2)
[代碼] 需要OOC-GCC的配合(請移步google code)
view sourceprint?
01
#include "OOStd.h"
02
03
CLASS(Animal){
04
char *name;
05
STATIC(Animal)
06
vFn talk;
07
};
08
int Animal_reload(Animal *THIS,char *name){
09
THIS->name=ALLOC(strlen(name)+1);
10
memcpy(THIS->name,name,strlen(name));
11
return 0;
12
}
13
int Animal_unload(Animal *THIS,void *PARAM){
14
FREE(THIS->name);
15
return 0;
16
}
17
ASM(Animal,Animal_reload,Animal_unload,NULL,NULL)
18
19
CLASS_EX(Animal,Cat){
20
STATIC_EX(Animal,Cat)
21
};
22
static void Meow(Animal *THIS){
23
printf("Meow!My name is %s!\n",THIS->name);
24
}
25
int Cat_reloadSt(StAnimal *THIS,void *PARAM){
26
THIS->talk=(void *)Meow;
27
return 0;
28
}
29
ASM_EX(Animal,Cat,NULL,NULL,Cat_reloadSt,NULL)
30
31
CLASS_EX(Animal,Dog){
32
STATIC_EX(Animal,Dog)
33
};
34
static void Woof(Animal *THIS){
35
printf("Woof!My name is %s!\n",THIS->name);
36
}
37
int Dog_reloadSt(StAnimal *THIS,void *PARAM){
38
THIS->talk=(void *)Woof;
39
return 0;
40
}
41
ASM_EX(Animal,Dog,NULL,NULL,Dog_reloadSt,NULL)
42
43
int main(){
44
Animal *a[]={
45
(void*)newDog("Jack"),
46
(void *)newCat("Lily"),
47
//Still,you can use the style below
48
NEW(Dog,"Mike"),
49
NEW(Cat,"Lucy"),
50
};
51
52
int i=0;
53
54
//for 0.9+
55
StAnimal *f=ST((a[0]));
56
57
//for 0.8 use the func below
58
//StAnimal *f=ST((Dog*)(a[0]));
59
60
for(i=0;i<4;++i){
61
f->talk(a[i]);
62
}
63
64
for(i=0;i<4;++i){
65
//this is for 0.9+
66
DEL0(a[i]);
67
68
//for 0.8+ you can use the func below
69
//delDog((Dog**)&(a[i]),NULL);
70
71
//for 0.8 only
72
//DEL0(Dog,&((Dog*)a[i]));
73
}
74
return 0;
75
}