|
Project Information
Featured
|
An easy to use Template to write OO program with pure C !latest version 0.22
英文比较挫,有些时候会漏打多打几个字母,比如wiki页里面就有,大家凑合看,就当找彩蛋建议下载打包好的压缩包,因为最后的版本懒得用svn传了,囧这不是C++,这是C!如果你用过GObject,就知道那个的繁琐和这个的简洁了这里的NEW,DELETE都是大写的,是宏!下文中大写的如下一些都是宏!CLASS,STATIC,ASMCLASS_EX,STATIC_EX,ASM_EXNEW,NEW0,DELETE,DELETE0,ST
How to Compile 如何编译e.g. "gcc OODbg.c test_Animals.c"上面加入OODbg.c文件的编译,可以提供内存分配的日志记录等功能,方便调试同时可配合graphviz绘制函数调用图表
Simple Cat/Dog Example一个简单的用于描述继承关系的例子这是用C语言配合OOC-GCC中定义的宏完成的更多例子打的包中有,wiki中有一些比较复杂的例子可以看那个简单解释器的例子//引入宏模板
//该模板纯粹靠C语言提供的宏扩展实现,并且不引入任何一个全局变量!
//足以保证使用上的方便与灵活
#include "OOStd.h"
//类的定义
CLASS(Animal){
char *name;
//声明公有区域,节约内存
STATIC(Animal);
//声明函数指针,STATIC宏保证了多个实例共享一块公有区域的内存
//vFn是对一种函数指针的类型重定义,配合OOC-GCC其它宏使用才有意义
vFn talk;
};
//构造函数的定义
static int Animal_load(Animal *THIS,void *name){
THIS->name=name;
return 0;
}
//绑定构造函数
ASM(Animal,Animal_load,NULL,NULL,NULL)
//声明带有继承关系的类
CLASS_EX(Cat,Animal){
//Cat类仅继承Animal类,并未进行扩展
STATIC_EX(Cat,Animal);
};
static void Meow(Animal *THIS){
printf("Meow!My name is %s!\n",THIS->name);
}
//声明公有区域的构造函数
static int Cat_loadSt(StAnimal *THIS,void *PARAM){
THIS->talk=(void *)Meow;
return 0;
}
//绑定构造函数,会自动的按顺序调用子类和父类的构造和析构函数
//这也是该模板最方便的地方之一
ASM_EX(Cat,Animal,NULL,NULL,Cat_loadSt,NULL)
CLASS_EX(Dog,Animal){
STATIC_EX(Dog,Animal);
};
static void Woof(Animal *THIS){
printf("Woof!My name is %s!\n",THIS->name);
}
static int Dog_loadSt(StAnimal *THIS,void *PARAM){
THIS->talk=(void *)Woof;
return 0;
}
ASM_EX(Dog,Animal,NULL,NULL,Dog_loadSt,NULL)
int main(){
Animal *animals[4000];
StAnimal *f;
int i=0;
for(i=0;i<4000;i++)
{
//关键字和C++提供的类似
//实例占用的内存每次都会分配,公有区域的内存只会没有该实例的时候分配
if(i%2==0) animals[i]=NEW(Dog,"Jack");
else animals[i]=NEW(Cat,"Lily");
};
//方法存放在公有区域,通过
f=ST(animals[0]);
for(i=0;i<4000;++i){
f->talk(animals[i]);
}
for(i=0;i<4000;++i){
//无需知道传入指针传入的指针指向的堆内存为何种类型
//都会调用正确的析构函数
//这里会根据实际情况调用Cat或Dog的析构函数
//实例区域的内存会被销毁,如果是最后的一个实例被销毁,
//则会自动销毁静态区域的内存
DELETE0(animals[i]);
}
return 0;
}the same thing done in C++和C++进行对比#include <iostream>
using namespace std;
class Animal
{
public:
Animal(const char* name) : name(name) {}
virtual void talk() = 0;
const char * name;
};
class Cat : public Animal
{
public:
Cat(const char* name) : Animal(name) {}
void talk() {
cout<<"Meow!Myname is "<<name<<endl;
}
};
class Dog : public Animal
{
public:
Dog(const char* name) : Animal(name) {}
void talk() {
cout<<"Woof!Myname is "<<name<<endl;
}
};
int main()
{
Animal* animals[4000] ;
int i=0;
for(i=0;i<4000;i++)
{
if(i%2==0) animals[i]=new Dog("Jack");
else animals[i]=new Cat("Lily");
};
for(int i = 0; i < 4000; i++){
animals[i]->talk();
}
for(int i = 0; i < 4000; i++){
delete animals[i];
}
return 0;
}if the compiler support closure,use the code below如果编译器支持闭包,会更像C++#include "OOStd.h"
CLASS(Animal){
char *name;
STATIC(Animal);
vFn talk;
};
static int Animal_load(Animal *THIS,void *name){
THIS->name=name;
return 0;
}
ASM(Animal,Animal_load,NULL,NULL,NULL)
CLASS_EX(Cat,Animal){
STATIC_EX(Cat,Animal);
};
static int Cat_loadSt(StAnimal *THIS,void *PARAM){
void Meow(Animal *THIS){
printf("Meow!My name is %s!\n",THIS->name);
}
THIS->talk=(void *)Meow;
return 0;
}
ASM_EX(Cat,Animal,NULL,NULL,Cat_loadSt,NULL)
CLASS_EX(Dog,Animal){
STATIC_EX(Dog,Animal);
};
static int Dog_loadSt(StAnimal *THIS,void *PARAM){
void Woof(Animal *THIS){
printf("Woof!My name is %s!\n",THIS->name);
}
THIS->talk=(void *)Woof;
return 0;
}
ASM_EX(Dog,Animal,NULL,NULL,Dog_loadSt,NULL)
int main(){
Animal *animals[4000];
StAnimal *f;
int i=0;
for(i=0;i<4000;i++)
{
if(i%2==0) animals[i]=NEW(Dog,"Jack");
else animals[i]=NEW(Cat,"Lily");
};
f=ST(animals[0]);
for(i=0;i<4000;++i){
f->talk(animals[i]);
}
for(i=0;i<4000;++i){
DELETE0(animals[i]);
}
return 0;
}
|