My favorites | Sign in
Project Home Downloads Wiki Issues Source
Project Information
Members
Featured
Downloads
Wiki pages

An easy to use Template to write OO program with pure C !

latest version 0.21

How to Compile

e.g. "gcc OODbg.c test_Animals.c"

Simple Cat/Dog Example

#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 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++)
	{
		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;
}

the same thing done in 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

#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;
}

0.20说明(和以往代码可能不兼容,需要少许修改,主要是继承声明的顺序)

•修正实例部分构造顺序上的一个bug,0.15.1中修改时只修改了静态部分,实例部分漏掉了 •增加一些宏,使静态部分与实例部分可以独立构造,更加自由 •增加静态部分继承支持 •增加一种更为自由的设计类的模式 •修正一些错误,修正一些命名方式,方便使用
0.15中的主要改进是
•增加和多根继承模拟相关的一些宏,不过只是最最简单的模拟 •改进new与del函数的设计,现在的支持返回值的处理以及额外内存的分配 •修正STATIC部分析构顺序上的一处错误
0.12中的主要改进是
•VC等编译器的兼容 •普通类和原始类(早期版本中称纯类,也就是普通结构体)的单根继承时的兼容 •ASM系列宏更加灵活强大 •CLASS和STATIC成为对等的顶级元素,可以独立声明原始CLASS和原始STATIC •更加规范的底层宏命名规则 •更加规范的普通宏使用规则 •提供早期简化风格的支持[通过宏开关开启]

个人感觉从0.8之后的才具有一定的实用性和规范性,之前的代码还是不用看了...

另外如果觉得宏有点多,设计有点复杂的, 还有一个简化版,其代码及配套实例请移步 http://code.google.com/p/ooc-lite/ 另外如需获取最新代码,请移步SVN仓库

Powered by Google Project Hosting