潘星臣=casazaft
admin@wewebos.com
2008.1.8
其实这里只是一个prototype模式,不过用汇编写起来,比较爽!
用C实现面向对象
首先,定义一个最基本的类,所有的类都必须包含一个基本类
typedef struct //最基本的类
{
int mesize;
void (*create)(void*);//构造函数
} basic_class;
写一个new函数
new.h
extern void* __cdecl malloc(unsigned int);
//-------------------------------------------new函数
void* new(void* father)
{
void* p;
int i;
_asm
{
mov eax,father
mov ecx,dword ptr[eax]//获得类大小
mov i,ecx
}
p=malloc(i);
_asm //调用父对象默认构造函数
{
mov eax,father
push eax
call dword ptr [eax+4]
add esp,4
}
_asm
{
mov ecx,i //拷贝父对象结构
mov esi,father
mov edi,p
rep movsb
}
return p;
}
//--------------------------------------------------------------------------- 问题点数:50、回复次数:14Top
1 楼casazaft()回复于 2006-06-09 20:11:16 得分 0
例子,写一个student类,先看c++的做法
class student
{
public:
char name[10];
int age;
char sex[5];
student();
void say(char* sen);
}
我用C实现类似的声明:
student.h
----------------------------
#include "new.h"
typedef struct
{
char name[10];
int age;
char sex[10];
}Student_data;//--------------------------------------------类数据成员声明
typedef struct
{
void* (*say)(char* sen);
}Student_method;//------------------------------------------类方法成员声明
typedef struct
{
basic_class me;
Student_data* data;
Student_method* method;
}Student; //-------------------------------------------类声明
//------------------------------------------------------------------------
void Stu_create(Student* self)
{
printf("please input name:");
scanf("%s",&self->data->name); //类构造函数
printf("please input age:");
scanf("%d",&self->data->age);
printf("please input sex:");
scanf("%s",&self->data->sex);
}
//------------------------------------------------------------------------
void say(char* sen)
{
printf("%s",sen); //类方法实现
}
//------------------------------------------------------------------------
Student_data student_data={"NUAA",0,"N/A"};//类数据成员父对象
Student_method student_method={say};//类方法成员父对象
Student student={{sizeof(Student),Stu_create},&student_data,&student_method};//类父对象
-----------------------------------------------------------------------------------
Top
2 楼casazaft()回复于 2006-06-09 20:12:43 得分 0
在main里:#include <stdio.h>
#include "student.h"
main()
{
Student* stu1;
stu1=new(&student);
stu1->method->say("hello!");
}