|
Project Information
Members
Featured
Downloads
Wiki pages
|
An easy to use Template to write OO program with pure C !latest version 0.21How to Compilee.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仓库 |