My favorites | Sign in
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Project Information
Members
Featured
Downloads
Wiki pages

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,ASM

CLASS_EX,STATIC_EX,ASM_EX

NEW,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;
}
Powered by Google Project Hosting