#ifndef __OBJECT_ORIENTED_C__#define __OBJECT_ORIENTED_C__#ifdef __cplusplusextern "C"{#endif

/*========================================================================*/
/*这一区块定义下面用到的一些名字组成宏*/
/*类方法名字拼接*/
#define METHOD(class, method)               class##_##method
/*类方法的类型的名字拼接*/
#define METHOD_TYPE(class, method)          __##class##_##method##_typedef__
/*类的虚函数表结构的名字拼接*/
#define VTBL_STRU_NAME(class)               __##class##_v_func_tbl__
/*类的虚函数在虚函数表中的位置的名字拼接*/
#define VTBL_FUNC_PTR_NAME(class, func)     __##class##_fp_##func##_offset__
/*类的虚函数表实体的名字拼接*/
#define VTBL_ENTITY_NAME(class)             __##class##_vtable_array__
/*类的虚函数表实体初始化函数的名字拼接*/
#define VTBL_ENTITY_INIT_METHOD(class)      __##class##_class_vtable_init__
/*类的虚函数表实体是否初始化OK的名字拼接*/
#define VTBL_ENTITY_IS_INIT_FLAG(class)     __##class##_class_vtable_is_init__
/*类的虚函数表实体初始化结构变量的名字拼接*/
#define VTBL_ENTITY_INIT_STRU_VAR(class)    class##_class_vtable_init_info
/*获取类的虚函数表初始化函数的指针*/
#define VTBL_ENTITY_INIT_METHOD_PTR(class)  ( VTBL_ENTITY_INIT_STRU_VAR(class) . vtable_init_method)
/*========================================================================*/

/*========================================================================*/
/*创建接口*/
#define new(class)                   METHOD(class, create)()
/*释放接口*/
#define delete(class, object)        METHOD(class, destory)(object)
/*========================================================================*/

/*========================================================================*/
/*类声明的开始宏*/
#define BEGIN_CLASS(class)                                          \
    struct class;                                                   \
typedef
struct class class; \struct VTBL_STRU_NAME(class); \extern class_vtable_init VTBL_ENTITY_INIT_STRU_VAR(class); \class * METHOD(class, create)(void); \int METHOD(class, constructor)(class* this); \void METHOD(class, destory)(class* this); \int METHOD(class, destructor)(class* this); \struct class /*继承自父类的声明*/ #define INHERITED_PARENT(p_class) \p_class parent/*类中的虚函数声明开始宏*/ #define BEGIN_V_METHOD_DEFINE(class) \ struct VTBL_STRU_NAME(class)/*类继承自父类的虚函数信息*/ #define INHERITED_V_METHOD(p_class) \ structVTBL_STRU_NAME(p_class) parent_vtbl/*单个虚函数声明处*/ #define DEFINE_V_METHOD(ret_type, method) \ret_type (* method )(void* this, ...)/*类中的虚函数声明结束宏*/ #define END_V_METHOD_DEFINE(class) /*根类的对象声明*/ #define ROOT_CLASS_DECLARE(class) \ struct VTBL_STRU_NAME(class) *vbtl;/*类中的声明结束宏*/ #define END_CLASS(class) /*========================================================================*/ /*虚拟函数指针的使用*/ #define GET_V_METHOD_PTR(class, func) \( VTBL_FUNC_PTR_NAME(class, func) )/*定义虚拟函数的类型*/ #define DEFINE_V_METHOD_TYPE(ret_type, class, method) \typedef ret_type (* METHOD_TYPE(class, method) )/*定义虚拟函数的指针: 修改为奇数场景*/ #define DEFINE_V_METHOD_PTR(class, method) \ enum { VTBL_FUNC_PTR_NAME(class, method) =\
((((
int )(&((struct VTBL_STRU_NAME(class) *)0)->method )) \/ sizeof(std_func_ptr))<<1) + 1}; \/*定义继承的虚拟函数的指针*/ #define INHERITED_V_METHOD_PTR(class, parent, method) \ enum { VTBL_FUNC_PTR_NAME(class, method) =\
VTBL_FUNC_PTR_NAME(parent, method) }; \
/*定义普通的虚拟函数的信息*/ #define DEFINE_V_METHOD_INFO(ret_type, class, method) \DEFINE_V_METHOD_PTR(class, method); \
DEFINE_V_METHOD_TYPE(ret_type,
class, method)/*定义继承的虚拟函数的信息*/ #define INHERITED_V_METHOD_INFO(ret_type, class, parent, method) \INHERITED_V_METHOD_PTR(class, parent, method); \
DEFINE_V_METHOD_TYPE(ret_type,
class, method)/*定义普通的成员函数的信息*/ #define DEFINE_C_METHOD_INFO(ret_type, class, method) \ extern ret_type METHOD(class, method)/*#define DEFINE_C_METHOD_INFO(ret_type, class, method) \
extern common_func_ptr __##class##_##method##_ptr__; \
typedef ret_type (* VTBL_FUNC_PTR_NAME(class, func) )
*/ /*调用对象的虚拟函数*/ #define CALL_V_METHOD(object, method_ptr) \(*(((*( common_func_ptr **) object ))[ ((unsigned int)method_ptr) >> 1]))/*调用对象的虚拟函数:支持参数严格校验*/ #define CALL_V_R_METHOD(object, class, method) \(*(((*( METHOD_TYPE(class, method) **) object ))[ GET_V_METHOD_PTR(class,method) >> 1]))/*调用对象的普通成员函数*/ #define CALL_C_METHOD(object, class, method) \METHOD(class, method)/*#define DECLARE_V_METHOD(ret_type, class, method) \
ret_type METHOD(class, method)

#define DECLARE_C_METHOD(ret_type, class, method) \
common_func_ptr __##class##_##method##_ptr__ = METHOD(class, method); \
ret_type METHOD(class, method)

#define CALL_C_METHOD(ret_type, class, method) \
*(VTBL_FUNC_PTR_NAME(class, method)__##class##_##method##_ptr__)
*/ /*========================================================================*/ /*实现类,主要是绑定类的虚拟函数指针*/ #define BEGIN_DECLARE_CLASS_VTABLE(class) \ static std_func_ptr VTBL_ENTITY_NAME(class) [ \sizeof(struct VTBL_STRU_NAME(class) )/sizeof(std_func_ptr)] = {0}; \static char VTBL_ENTITY_IS_INIT_FLAG(class) = 0; \static int VTBL_ENTITY_INIT_METHOD(class) (std_func_ptr *vtbl) \
{ \
if (0 != VTBL_ENTITY_IS_INIT_FLAG(class) ) return 1; \if (0 == vtbl) return 0; \do /*继承父类的VTABLE*/ #define INHERITED_VTABLE_INIT(parent) \ if (0 == VTBL_ENTITY_INIT_METHOD_PTR(parent) (vtbl)) return 0 /*继承的虚函数表项初始化*/ #define INHERITED_VTABLE_METHOD_INIT(class, parent, method) \vtbl[((int )(&((struct VTBL_STRU_NAME(parent) * )0)->method )) \/ sizeof(std_func_ptr)] \= (std_func_ptr) METHOD(class, method)/*自身的虚函数表项初始化*/ #define SELF_VTABLE_METHOD_INIT(class, method) \INHERITED_VTABLE_METHOD_INIT(class, class, method)/*实现类的结束宏*/ #define END_DECLARE_CLASS_VTABLE(class) \ while(0); \
VTBL_ENTITY_IS_INIT_FLAG(
class) = 1; \return 1; \
} \
class_vtable_init VTBL_ENTITY_INIT_STRU_VAR(
class) =\
{ VTBL_ENTITY_INIT_METHOD(
class), VTBL_ENTITY_NAME(class)};/*========================================================================*/ /*========================================================================*/ /*类的构造函数,主要提供两个接口:
一个是create,以支持new,
一个是constructor,就是构造并初始化的函数
*/ #define BEGIN_CONSTRUCTOR(class, parent) \ extern int METHOD(class, constructor) (class * this); \class* METHOD(class, create) (void) \
{ \
return common_create_object(sizeof( class), \
(std_func_ptr) METHOD(
class, constructor)); \
} \
\
int METHOD(class, constructor) (class * this) \
{ \
VTBL_ENTITY_INIT_METHOD(
class) ( VTBL_ENTITY_NAME(class) ); \if (0 != METHOD(parent, constructor) (( parent *)(this))) \return 1; \*(struct VTBL_STRU_NAME(class) **)this =\
(
struct VTBL_STRU_NAME(class) *) VTBL_ENTITY_NAME(class) ; \do\/*类构造函数的结束宏*/ #define END_CONSTRUCTOR(class, parent) \ while(0); \return 0; \
}
/*根类的父类构造函数为0*/ #define void_constructor(this) (0) /*========================================================================*/ /*========================================================================*/ /*类的析构函数,主要提供两个接口:
一个是destory,以支持delete,
一个是destructor,就是析构函数
*/ #define BEGIN_DESTRUCTOR(class, parent) \ extern int METHOD(class, destructor) (class * this); \void METHOD(class, destory) ( class * this) \
{ \
common_destory_object(
this, \
(std_func_ptr) METHOD(
class, destructor) ); \
} \
\
int METHOD(class, destructor) (class * this) \
{ \
do\/*类析构函数的结束宏*/ #define END_DESTRUCTOR(class, parent) \ while(0); \if (0 != METHOD(parent, destructor) (( parent *)(this))) \return 1; \return 0; \
}
/*根类的父类析构函数为0*/ #define void_destructor(this) (0) /*========================================================================*/typedefint (*std_func_ptr)(void*);
typedef
int (*common_func_ptr)(void*, ...);

typedef
struct{int (*vtable_init_method)(std_func_ptr*);
std_func_ptr vtable_array;
}class_vtable_init;
void* common_create_object(unsigned intsize, std_func_ptr pCtor);void common_destory_object(void* this, std_func_ptr pDtor);void common_destory_object_non_virtual(void* this, std_func_ptr pDtor);

#ifdef __cplusplus
};
#endif /* end of __cplusplus */ #endif
#include "ooc.hoo"#include<stdio.h>#include<stdlib.h>

void* common_create_object(unsigned intsize, std_func_ptr pCtor)
{
/*分配对象*/ void* object =malloc(size);/*如果分配失败,返回0*/ if (0 == object)return 0;/*调用构造函数*/ if (0 != (*pCtor)(object))
{
/*构造函数执行失败,释放对象*/free(object);return 0;
}
/*成功,返回对象*/ return object;
}
void common_destory_object(void* this, std_func_ptr pDtor)
{
/*如果对象为空*/ if (0 == this) return;/*如果存在虚函数表指针*/ if (0 != *(void**)this)
{
/*调用虚函数表中的第一个函数指针,默认此函数为析构函数*/ if (0 != (*((*(std_func_ptr**)this)[0]))((void*)this))return;
}
else{/*不为空,则调用传入的析构函数指针*/ if (0 != (*pDtor)(this))return;
}
/*最后释放对象*/free(this);
}
void common_destory_object_non_virtual(void* this, std_func_ptr pDtor)
{
if (0 == this) return;if (0 != (*pDtor)(this))return;/*free*/free(this);
}
#ifndef __BASE_OBJECT_STRUCT__#define __BASE_OBJECT_STRUCT__#include<glib.h>#include<glib-object.h>#include"ooc.hoo"#ifdef __cplusplusextern "C"{#endif#ifndef __GNUC__#define SIGNAL_CALLBACK __cdcel
#else
#define SIGNAL_CALLBACK __attribute__((cdecl))
#endifBEGIN_CLASS(BaseObject)
{
/*类自身的数据*/ROOT_CLASS_DECLARE(BaseObject)/*虚拟函数表的定义处*/BEGIN_V_METHOD_DEFINE(BaseObject)
{
/*自身的虚函数*/DEFINE_V_METHOD(int, destructor);/*自身的虚函数*/DEFINE_V_METHOD(gulong, setupObject);
}
END_V_METHOD_DEFINE(BaseObject);
/*对象的数据*/GObject*x_pObject;
GSList
*x_pObjectList;
}
END_CLASS(BaseObject);

typedef gulong (
*CommonCallback)(BaseObject* this, GObject*instance, ...);

typedef
structObjectCallbackInfo
{
BaseObject
*x_pThis;
CommonCallback x_pCallback;
GObject
*x_pWidget;
} ObjectCallbackInfo;

DEFINE_V_METHOD_INFO(
int , BaseObject, destructor) (BaseObject* this);
DEFINE_V_METHOD_INFO(gulong , BaseObject, setupObject) (BaseObject
* this);
DEFINE_C_METHOD_INFO(gulong , BaseObject, ConnectSignal) (BaseObject
* this, gpointer instance, const gchar *detailed_signal, CommonCallback c_handler);
DEFINE_C_METHOD_INFO(gulong , BaseObject, SignalProc) (
const ObjectCallbackInfo*lpObject, ...);

#ifdef __cplusplus
};
#endif /* end of __cplusplus */ #endif
#include "BaseObject.hoo"gulong METHOD(BaseObject, SignalProc)(const ObjectCallbackInfo*lpObject, ...)
{
va_list pArgList;
gulong ulRetcode;
struct reserve_arg { gulong ulReserver[20];} *pstTemp;/*收到信号时,先判断指针*/ if ( (NULL == lpObject) || (NULL == lpObject->x_pCallback ) || (NULL == lpObject->x_pWidget))
{
return 0;
}
/*取出this指针及成员函数指针*/va_start(pArgList, lpObject);
pstTemp
= (struct reserve_arg*)pArgList;/*调用成员函数*/ if ((((unsigned int)lpObject->x_pCallback) & 0x1) == 0x1)
{
printf(
"enter virtual method branch!\n");
ulRetcode
= CALL_V_METHOD ((lpObject->x_pThis), (lpObject->x_pCallback)) (lpObject->x_pThis, lpObject->x_pWidget, *pstTemp);
}
else{
ulRetcode
= (*(lpObject->x_pCallback))(lpObject->x_pThis, lpObject->x_pWidget, *pstTemp);
}

va_end(pArgList);
returnulRetcode;
}

gulong METHOD(BaseObject, ConnectSignal)(BaseObject
* this, gpointer instance,const gchar *detailed_signal,
CommonCallback c_handler)
{
/*分配存放回调指针的空间*/ObjectCallbackInfo* lpObject = (ObjectCallbackInfo*)g_malloc(sizeof(ObjectCallbackInfo));if (NULL ==lpObject)
{
return 0;
}
lpObject
->x_pThis = this;
lpObject
->x_pCallback =c_handler;
lpObject
->x_pWidget = (GObject*)instance;/*将信息保存在slist中*/ this->x_pObjectList = g_slist_append(this->x_pObjectList, lpObject);/*注册信号回调*/ returng_signal_connect_swapped(instance, detailed_signal,
(GCallback)
&( METHOD(BaseObject, SignalProc) ),
(gpointer)lpObject);
}

BEGIN_DECLARE_CLASS_VTABLE(BaseObject)
{
SELF_VTABLE_METHOD_INIT(BaseObject, destructor);
}
END_DECLARE_CLASS_VTABLE(BaseObject)

BEGIN_CONSTRUCTOR(BaseObject,
void)
{
this->x_pObject =NULL;this->x_pObjectList =NULL;
}
END_CONSTRUCTOR(BaseObject,
void)

BEGIN_DESTRUCTOR(BaseObject,
void)
{
/*释放所有分配的ObjectToMemFunc空间*/gpointer lpObj;
GSList
* lpTempList = this->x_pObjectList;while (NULL !=lpTempList)
{
/*如果非空*/lpObj= g_slist_nth_data(lpTempList, 0);if (NULL !=lpObj)
{
g_free(lpObj);
}

lpTempList
=g_slist_next(lpTempList);
}
/*删除列表*/ if (NULL != this->x_pObjectList)
{
g_slist_free(
this->x_pObjectList);
}
}
END_DESTRUCTOR(BaseObject,
void)
#ifndef __UI_TEST_WIN__#define __UI_TEST_WIN__#include"BaseObject.hoo"#include<gtk/gtk.h>

/*测试的第一个类*/BEGIN_CLASS(TestDialog)
{
/*继承自NullClass*/INHERITED_PARENT(BaseObject);/*虚拟函数表的定义处*/BEGIN_V_METHOD_DEFINE(TestDialog)
{
/*继承自NullClass*/INHERITED_V_METHOD(BaseObject);/*自身的虚函数*/DEFINE_V_METHOD(SIGNAL_CALLBACK gulong, OnOk) ;
DEFINE_V_METHOD(SIGNAL_CALLBACK gulong, OnChange) ;
}
END_V_METHOD_DEFINE(TestDialog);
/*类自身的数据*/ /*GtkWidget *calendar1;*/GtkWidget*notebook1;
GtkWidget
*empty_notebook_page;
GtkWidget
*label1;
GtkWidget
*label2;
GtkWidget
*label3;
}
END_CLASS(TestDialog);

INHERITED_V_METHOD_INFO(
int , TestDialog, BaseObject, destructor) (TestDialog* this);
INHERITED_V_METHOD_INFO(
int, TestDialog, BaseObject, setupObject) (TestDialog* this);
DEFINE_V_METHOD_INFO(SIGNAL_CALLBACK gulong, TestDialog, OnOk) (TestDialog
* this, GtkWidget *notebook1);
DEFINE_V_METHOD_INFO(SIGNAL_CALLBACK gulong, TestDialog, OnChange) (TestDialog
* this, GtkWidget *notebook1, GtkNotebookPage *page, guint num);#endif
#include "ui_testwin.hoo"gulong METHOD(TestDialog, OnOk)(TestDialog* this, GtkWidget *notebook1)
{
printf(
"this : %08x\n", this);
printf(
"notebook : %08x\n", notebook1);
fflush(stdout);
gtk_main_quit();
return 0;
}

gulong METHOD(TestDialog, OnChange)(TestDialog
* this, GtkWidget *notebook1, GtkNotebookPage *page, guint num)
{
printf(
"this : %08x\n", this);
printf(
"notebook : %08x\n", notebook1);
printf(
"page : %08x\n", page);
printf(
"Current Page: %d(%08x)\n", num, num);return 0;
}

gulong METHOD(TestDialog, setupObject)(TestDialog
* this)
{
GtkWidget
* window1 =gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window1),
"window1");

METHOD(BaseObject, ConnectSignal) (
this, G_OBJECT (window1), "destroy", (CommonCallback)( GET_V_METHOD_PTR(TestDialog, OnOk )));this->notebook1 =gtk_notebook_new ();
gtk_widget_show (
this->notebook1);
gtk_container_add (GTK_CONTAINER (window1),
this->notebook1);this->empty_notebook_page = gtk_vbox_new (FALSE, 0);
gtk_widget_show (
this->empty_notebook_page);
gtk_container_add (GTK_CONTAINER (
this->notebook1), this->empty_notebook_page);this->label1 = gtk_label_new (("label1"));
gtk_widget_show (
this->label1);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (
this->notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (this->notebook1), 0), this->label1);this->empty_notebook_page = gtk_vbox_new (FALSE, 0);
gtk_widget_show (
this->empty_notebook_page);
gtk_container_add (GTK_CONTAINER (
this->notebook1), this->empty_notebook_page);this->label2 = gtk_label_new (("label2"));
gtk_widget_show (
this->label2);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (
this->notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (this->notebook1), 1), this->label2);this->empty_notebook_page = gtk_vbox_new (FALSE, 0);
gtk_widget_show (
this->empty_notebook_page);
gtk_container_add (GTK_CONTAINER (
this->notebook1), this->empty_notebook_page);this->label3 = gtk_label_new (("label3"));
gtk_widget_show (
this->label3);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (
this->notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (this->notebook1), 2), this->label3);

METHOD(BaseObject, ConnectSignal) (
this, G_OBJECT (this->notebook1), "switch-page", (CommonCallback)(GET_V_METHOD_PTR(TestDialog,OnChange)));/*Store pointers to all widgets, for use by lookup_widget().*/ //GLADE_HOOKUP_OBJECT_NO_REF (window1, window1, "window1");//GLADE_HOOKUP_OBJECT (window1, calendar1, "calendar1"); gtk_widget_show(window1);/*存放对象的基类指针*/ this->parent.x_pObject = (GObject*)window1;return 0;
}

BEGIN_DECLARE_CLASS_VTABLE(TestDialog)
{
INHERITED_VTABLE_INIT(BaseObject);

INHERITED_VTABLE_METHOD_INIT(TestDialog, BaseObject, destructor);
INHERITED_VTABLE_METHOD_INIT(TestDialog, BaseObject, setupObject);

SELF_VTABLE_METHOD_INIT(TestDialog, OnOk);
SELF_VTABLE_METHOD_INIT(TestDialog, OnChange);
}
END_DECLARE_CLASS_VTABLE(TestDialog)

BEGIN_CONSTRUCTOR(TestDialog, BaseObject)
{
}
END_CONSTRUCTOR(TestDialog, BaseObject)

BEGIN_DESTRUCTOR(TestDialog, BaseObject)
{
}
END_DESTRUCTOR(TestClass, BaseObject)
int main (int argc, char *argv[])
{
TestDialog
* lpDialog =NULL;

gtk_init(
&argc, &argv);

lpDialog
= new(TestDialog);

CALL_V_R_METHOD(lpDialog, TestDialog, setupObject)(lpDialog);

gtk_main ();

delete(TestDialog, lpDialog);
return 0;
}

 

参考了网上很多人的代码,不一一列举了

/*========================================================================*/
/*这一区块定义下面用到的一些名字组成宏*/
/*类方法名字拼接*/
#define METHOD(class, method)               class##_##method
/*类方法的类型的名字拼接*/
#define METHOD_TYPE(class, method)          __##class##_##method##_typedef__
/*类的虚函数表结构的名字拼接*/
#define VTBL_STRU_NAME(class)               __##class##_v_func_tbl__
/*类的虚函数在虚函数表中的位置的名字拼接*/
#define VTBL_FUNC_PTR_NAME(class, func)     __##class##_fp_##func##_offset__
/*类的虚函数表实体的名字拼接*/
#define VTBL_ENTITY_NAME(class)             __##class##_vtable_array__
/*类的虚函数表实体初始化函数的名字拼接*/
#define VTBL_ENTITY_INIT_METHOD(class)      __##class##_class_vtable_init__
/*类的虚函数表实体是否初始化OK的名字拼接*/
#define VTBL_ENTITY_IS_INIT_FLAG(class)     __##class##_class_vtable_is_init__
/*类的虚函数表实体初始化结构变量的名字拼接*/
#define VTBL_ENTITY_INIT_STRU_VAR(class)    class##_class_vtable_init_info
/*获取类的虚函数表初始化函数的指针*/
#define VTBL_ENTITY_INIT_METHOD_PTR(class)  ( VTBL_ENTITY_INIT_STRU_VAR(class) . vtable_init_method)
/*========================================================================*/

/*========================================================================*/
/*创建接口*/
#define new(class)                   METHOD(class, create)()
/*释放接口*/
#define delete(class, object)        METHOD(class, destory)(object)
/*========================================================================*/

/*========================================================================*/
/*类声明的开始宏*/
#define BEGIN_CLASS(class)                                          \
    struct class;                                                   \
typedef
struct class class; \struct VTBL_STRU_NAME(class); \extern class_vtable_init VTBL_ENTITY_INIT_STRU_VAR(class); \class * METHOD(class, create)(void); \int METHOD(class, constructor)(class* this); \void METHOD(class, destory)(class* this); \int METHOD(class, destructor)(class* this); \struct class /*继承自父类的声明*/ #define INHERITED_PARENT(p_class) \p_class parent/*类中的虚函数声明开始宏*/ #define BEGIN_V_METHOD_DEFINE(class) \ struct VTBL_STRU_NAME(class)/*类继承自父类的虚函数信息*/ #define INHERITED_V_METHOD(p_class) \ structVTBL_STRU_NAME(p_class) parent_vtbl/*单个虚函数声明处*/ #define DEFINE_V_METHOD(ret_type, method) \ret_type (* method )(void* this, ...)/*类中的虚函数声明结束宏*/ #define END_V_METHOD_DEFINE(class) /*根类的对象声明*/ #define ROOT_CLASS_DECLARE(class) \ struct VTBL_STRU_NAME(class) *vbtl;/*类中的声明结束宏*/ #define END_CLASS(class) /*========================================================================*/ /*虚拟函数指针的使用*/ #define GET_V_METHOD_PTR(class, func) \( VTBL_FUNC_PTR_NAME(class, func) )/*定义虚拟函数的类型*/ #define DEFINE_V_METHOD_TYPE(ret_type, class, method) \typedef ret_type (* METHOD_TYPE(class, method) )/*定义虚拟函数的指针*/ #define DEFINE_V_METHOD_PTR(class, method) \ enum { VTBL_FUNC_PTR_NAME(class, method) =\
(((
int )(&((struct VTBL_STRU_NAME(class) *)0)->method )) \/ sizeof(std_func_ptr)) + 1}; \/*定义继承的虚拟函数的指针*/ #define INHERITED_V_METHOD_PTR(class, parent, method) \ enum { VTBL_FUNC_PTR_NAME(class, method) =\
VTBL_FUNC_PTR_NAME(parent, method) }; \
/*定义普通的虚拟函数的信息*/ #define DEFINE_V_METHOD_INFO(ret_type, class, method) \DEFINE_V_METHOD_PTR(class, method); \
DEFINE_V_METHOD_TYPE(ret_type,
class, method)/*定义继承的虚拟函数的信息*/ #define INHERITED_V_METHOD_INFO(ret_type, class, parent, method) \INHERITED_V_METHOD_PTR(class, parent, method); \
DEFINE_V_METHOD_TYPE(ret_type,
class, method)/*定义普通的成员函数的信息*/ #define DEFINE_C_METHOD_INFO(ret_type, class, method) \ extern ret_type METHOD(class, method)/*#define DEFINE_C_METHOD_INFO(ret_type, class, method) \
extern common_func_ptr __##class##_##method##_ptr__; \
typedef ret_type (* VTBL_FUNC_PTR_NAME(class, func) )
*/ /*调用对象的虚拟函数*/ #define CALL_V_METHOD(object, class, method) \(*(((*( METHOD_TYPE(class, method) **) object ))[ GET_V_METHOD_PTR(class,method) - 1]))/*调用对象的普通成员函数*/ #define CALL_C_METHOD(object, class, method) \METHOD(class, method)/*#define DECLARE_V_METHOD(ret_type, class, method) \
ret_type METHOD(class, method)

#define DECLARE_C_METHOD(ret_type, class, method) \
common_func_ptr __##class##_##method##_ptr__ = METHOD(class, method); \
ret_type METHOD(class, method)

#define CALL_C_METHOD(ret_type, class, method) \
*(VTBL_FUNC_PTR_NAME(class, method)__##class##_##method##_ptr__)
*/ /*========================================================================*/ /*实现类,主要是绑定类的虚拟函数指针*/ #define BEGIN_DECLARE_CLASS_VTABLE(class) \ static std_func_ptr VTBL_ENTITY_NAME(class) [ \sizeof(struct VTBL_STRU_NAME(class) )/sizeof(std_func_ptr)] = {0}; \static char VTBL_ENTITY_IS_INIT_FLAG(class) = 0; \static int VTBL_ENTITY_INIT_METHOD(class) (std_func_ptr *vtbl) \
{ \
if (0 != VTBL_ENTITY_IS_INIT_FLAG(class) ) return 1; \if (0 == vtbl) return 0; \do /*继承父类的VTABLE*/ #define INHERITED_VTABLE_INIT(parent) \ if (0 == VTBL_ENTITY_INIT_METHOD_PTR(parent) (vtbl)) return 0 /*继承的虚函数表项初始化*/ #define INHERITED_VTABLE_METHOD_INIT(class, parent, method) \vtbl[((int )(&((struct VTBL_STRU_NAME(parent) * )0)->method )) \/ sizeof(std_func_ptr)] \= (std_func_ptr) METHOD(class, method)/*自身的虚函数表项初始化*/ #define SELF_VTABLE_METHOD_INIT(class, method) \INHERITED_VTABLE_METHOD_INIT(class, class, method)/*实现类的结束宏*/ #define END_DECLARE_CLASS_VTABLE(class) \ while(0); \
VTBL_ENTITY_IS_INIT_FLAG(
class) = 1; \return 1; \
} \
class_vtable_init VTBL_ENTITY_INIT_STRU_VAR(
class) =\
{VTBL_ENTITY_INIT_METHOD(
class), VTBL_ENTITY_NAME(class)};/*========================================================================*/ /*========================================================================*/ /*类的构造函数,主要提供两个接口:
一个是create,以支持new,
一个是constructor,就是构造并初始化的函数
*/ #define BEGIN_CONSTRUCTOR(class, parent) \ extern int METHOD(class, constructor) (class * this); \class* METHOD(class, create) (void) \
{ \
return common_create_object(sizeof( class), \
(std_func_ptr) METHOD(
class, constructor)); \
} \
\
int METHOD(class, constructor) (class * this) \
{ \
VTBL_ENTITY_INIT_METHOD(
class) ( VTBL_ENTITY_NAME(class) ); \if (0 != METHOD(parent, constructor) (( parent *)(this))) \return 1; \*(struct VTBL_STRU_NAME(class) **)this =\
(
struct VTBL_STRU_NAME(class) *) VTBL_ENTITY_NAME(class) ; \do\/*类构造函数的结束宏*/ #define END_CONSTRUCTOR(class, parent) \ while(0); \return 0; \
}
/*根类的父类构造函数为0*/ #define void_constructor(this) (0) /*========================================================================*/ /*========================================================================*/ /*类的析构函数,主要提供两个接口:
一个是destory,以支持delete,
一个是destructor,就是析构函数
*/ #define BEGIN_DESTRUCTOR(class, parent) \ extern int METHOD(class, destructor) (class * this); \void METHOD(class, destory) ( class * this) \
{ \
common_destory_object(
this, \
(std_func_ptr) METHOD(
class, destructor) ); \
} \
\
int METHOD(class, destructor) (class * this) \
{ \
do\/*类析构函数的结束宏*/ #define END_DESTRUCTOR(class, parent) \ while(0); \if (0 != METHOD(parent, destructor) (( parent *)(this))) \return 1; \return 0; \
}
/*根类的父类析构函数为0*/ #define void_destructor(this) (0) /*========================================================================*/typedefint (*std_func_ptr)(void*);
typedef
int (*common_func_ptr)(void*, ...);

typedef
struct{int (*vtable_init_method)(std_func_ptr*);
std_func_ptr vtable_array;
}class_vtable_init;
void* common_create_object(unsigned intsize, std_func_ptr pCtor);void common_destory_object(void* this, std_func_ptr pDtor);void common_destory_object_non_virtual(void* this, std_func_ptr pDtor);/*Null类,应该为所有类的虚根*/BEGIN_CLASS(NullClass)
{
/*类自身的数据*/ROOT_CLASS_DECLARE(NullClass)/*虚拟函数表的定义处*/BEGIN_V_METHOD_DEFINE(NullClass)
{
/*自身的虚函数*/DEFINE_V_METHOD(int, destructor);
}
END_V_METHOD_DEFINE(NullClass);
}
END_CLASS(NullClass);

DEFINE_V_METHOD_INFO(
int , NullClass, destructor) (NullClass* this);/*测试的第一个类*/BEGIN_CLASS(TestClass)
{
/*继承自NullClass*/INHERITED_PARENT(NullClass);/*虚拟函数表的定义处*/BEGIN_V_METHOD_DEFINE(TestClass)
{
/*继承自NullClass*/INHERITED_V_METHOD(NullClass);/*自身的虚函数*/DEFINE_V_METHOD(int, open) ;
DEFINE_V_METHOD(
void, close);
}
END_V_METHOD_DEFINE(TestClass);
/*类自身的数据*/ intx_pThis;
}
END_CLASS(TestClass);

INHERITED_V_METHOD_INFO(
int , TestClass, NullClass, destructor) (TestClass* this);
DEFINE_V_METHOD_INFO(
int, TestClass, open) (TestClass* this, char*filename);
DEFINE_V_METHOD_INFO(
void, TestClass, close) (TestClass* this, inthandle);/*继承上一个类*/BEGIN_CLASS(InheritClass)
{
/*TestClass*/INHERITED_PARENT(TestClass);/*虚拟函数表的定义处*/BEGIN_V_METHOD_DEFINE(InheritClass)
{
/*继承自TestClass*/INHERITED_V_METHOD(TestClass);/*自身的虚函数*/DEFINE_V_METHOD(int, seek) ;
}
END_V_METHOD_DEFINE(InheritClass);
/*类自身的数据*/ intx_nOffset;
}
END_CLASS(InheritClass);

INHERITED_V_METHOD_INFO(
void, InheritClass, TestClass, destructor)(InheritClass* this);
INHERITED_V_METHOD_INFO(
void, InheritClass, TestClass, close)(InheritClass* this, inthandle);
DEFINE_V_METHOD_INFO(
int, InheritClass, seek)(InheritClass* this, int handle, int offset);

 

#include "ooc.h"#include<stdio.h>#include<stdlib.h>

void* common_create_object(unsigned intsize, std_func_ptr pCtor)
{
/*分配对象*/ void* object =malloc(size);/*如果分配失败,返回0*/ if (0 == object)return 0;/*调用构造函数*/ if (0 != (*pCtor)(object))
{
/*构造函数执行失败,释放对象*/free(object);return 0;
}
/*成功,返回对象*/ return object;
}
void common_destory_object(void* this, std_func_ptr pDtor)
{
/*如果对象为空*/ if (0 == this) return;/*如果存在虚函数表指针*/ if (0 != *(void**)this)
{
/*调用虚函数表中的第一个函数指针,默认此函数为析构函数*/ if (0 != (*((*(std_func_ptr**)this)[0]))((void*)this))return;
}
else{/*不为空,则调用传入的析构函数指针*/ if (0 != (*pDtor)(this))return;
}
/*最后释放对象*/free(this);
}
void common_destory_object_non_virtual(void* this, std_func_ptr pDtor)
{
if (0 == this) return;if (0 != (*pDtor)(this))return;/*free*/free(this);
}

BEGIN_DECLARE_CLASS_VTABLE(NullClass)
{
SELF_VTABLE_METHOD_INIT(NullClass, destructor);
}
END_DECLARE_CLASS_VTABLE(NullClass)

BEGIN_CONSTRUCTOR(NullClass,
void)
{
/*do something*/printf("call NullClass_constructor\n");
}
END_CONSTRUCTOR(NullClass,
void)

BEGIN_DESTRUCTOR(NullClass,
void)
{
/*do something*/printf("call NullClass_destructor\n");
}
END_DESTRUCTOR(NullClass,
void)int METHOD(TestClass, open) (TestClass* this, char*filename)
{
printf(
"call TestClass_open\n");return 0;
}
void METHOD(TestClass, close) (TestClass* this, inthandle)
{
printf(
"call TestClass_close\n");return;
}

BEGIN_DECLARE_CLASS_VTABLE(TestClass)
{
INHERITED_VTABLE_INIT(NullClass);

INHERITED_VTABLE_METHOD_INIT(TestClass, NullClass, destructor);

SELF_VTABLE_METHOD_INIT(TestClass, open);
SELF_VTABLE_METHOD_INIT(TestClass, close);
}
END_DECLARE_CLASS_VTABLE(TestClass)

BEGIN_CONSTRUCTOR(TestClass, NullClass)
{
/*do something*/printf("call TestClass_constructor\n");this->x_pThis = 0;
}
END_CONSTRUCTOR(TestClass, NullClass)

BEGIN_DESTRUCTOR(TestClass, NullClass)
{
/*do something*/printf("call TestClass_destructor\n");this->x_pThis = 0;
}
END_DESTRUCTOR(TestClass, NullClass)
int METHOD(InheritClass, seek) (InheritClass* this, int handle, intoffset)
{
printf(
"call InheritClass_seek\n");return 0;
}
void METHOD(InheritClass, close) (InheritClass* this, inthandle)
{
printf(
"call InheritClass_close\n");return;
}

BEGIN_DECLARE_CLASS_VTABLE(InheritClass)
{
INHERITED_VTABLE_INIT(TestClass);

INHERITED_VTABLE_METHOD_INIT(InheritClass, NullClass, destructor);
INHERITED_VTABLE_METHOD_INIT(InheritClass, TestClass, close);

SELF_VTABLE_METHOD_INIT(InheritClass, seek);
}
END_DECLARE_CLASS_VTABLE(InheritClass)

BEGIN_CONSTRUCTOR(InheritClass, TestClass)
{
/*do something*/printf("call InheritClass_constructor\n");
}
END_CONSTRUCTOR(InheritClass, TestClass)

BEGIN_DESTRUCTOR(InheritClass, TestClass)
{
/*do something*/printf("call InheritClass_destructor\n");
}
END_DESTRUCTOR(InheritClass, TestClass)
intmain()
{
TestClass
*pTest;
TestClass
*pTest2;

pTest
= new(TestClass);//(*(((TestClass_ops*)(pTest->parent.vbtl))->open))(pTest, ""); CALL_V_METHOD(pTest, TestClass, open)(pTest, "");//(*(((TestClass_ops*)(pTest->parent.vbtl))->close))(pTest, 1); CALL_V_METHOD(pTest, TestClass, close)(pTest, 1);

delete(TestClass, pTest);
printf(
"==========================================\n");

pTest2
= new(InheritClass);//(*(((TestClass_ops*)(pTest2->parent.vbtl))->close))(pTest2, 1); CALL_V_METHOD(pTest2, TestClass, close)(pTest2, 1);//or CALL_V_METHOD(pTest2, InheritClass, close)(pTest2, 1);
delete(InheritClass, pTest2);
return 0;
}

 

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
ZQAA

MIME-Version: 1.0
Content-Type: application/octet-stream; name="启程光盘助手_格式.7z"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="启程光盘助手_格式.7z"

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