面向对象是一种程序设计思想, 并不局限于那种语言, 所以如果你认为只有c++, java等才能进行面向对象设计, 那说明你在面向对象设计方面还没入门。 下面就介绍一个简单C语言的面向对象的实现方法。
C语言本身对面向对象方面的支持比较弱, 不过好在他提供了函数指针, 这为实现面向对象设计提供了很好的帮助(其实最早的C++预处理器--cfront就利用了这一点)。 Linus说过, C++不适合操作系统设计, 操作系统需要面向对象,但C足够了。
#ifndef _CLASS_H
#define _CLASS_H
#include <stdlib.h>
#define CLASS(class_name) /
typedef struct struct_##class_name class_name; /
DECLARE_CLASS_CREATE(my_class); /
struct struct_##class_name
#define __CLASS_CREATE(class_name) /
__##class_name##_create
#define CLASS_CREATE(class_name) /
void __##class_name##_create(class_name * self)
/* 声明类创建函数以供new等调用 */
#define DECLARE_CLASS_CREATE(class_name) /
CLASS_CREATE(class_name)
#define CALL_CLASS_CREATE(class_name, self) /
__CLASS_CREATE(class_name)(self)
typedef void (* __CLASS_CREATE_func)(void * objp);
void * __new(unsigned long size, __CLASS_CREATE_func __create);
#define new(class_name) __new(sizeof(class_name), (__CLASS_CREATE_func)__CLASS_CREATE(class_name))
#define delete(self) /
{ /
if (self && self->dtor) /
{ /
self->dtor(self); /
} /
free(self); /
self = NULL; /
} /
#define MBR_SET(mbr_name, mbr_func) self->mbr_name = mbr_func
#define MBR_SETUP(mbr) MBR_SET(mbr, mbr) /**< 有自定义的析构函数时可用此 */
#define MBR_CLEAR(mbr) self->mbr = NULL /**< 无自主义析构函数时使用 */
#define PRIVATE(mbr) __private_##mbr
#endif /* _CLASS_H */
void * __new(unsigned long size, __CLASS_CREATE_func __create)
{
void * p;
p = malloc(size);
if (p)
{
__create(p); /**< 此函数在相应的class实现文件中定义 */
}
return p;
}
然后在定义自己的C模拟类时把以上两个文件包含到project,并且是“类”定义头文件中包括class.h头文件即可实现部分OO
如下my_class类的定义:
#ifndef _MY_CLASS_H
#define _MY_CLASS_H
CLASS(my_class)
{
int _a;
void (* ctor)(my_class * self, int a);
void (* dtor)(my_class * self);
void (* set_a)(my_class * self, int _a);
int (* get_a)(my_class * self);
};
#endif /* _MY_CLASS_H */
static void ctor(my_class * self, int a) /**< 构造函数 */
{
self->_a = a;
}
static void dtor(my_class * self) /**< 析构函数 */
{
self->_a = 0;
}
static void set_a(my_class * self, int a)
{
self->_a = a;
}
static int get_a(my_class * self)
{
return self->_a;
}
CLASS_CREATE(my_class)
{
MBR_SETUP(ctor);
MBR_SETUP(set_a);
MBR_SETUP(get_a);
MBR_CLEAR(dtor); /**< 不使用自定义析构函数 */
self->ctor(self, 0); /**< 初始化为0 */
}
然后对my_class类的实例化及使用可如main.c文件中那样 。。。
int main(void)
{
/* 堆空间初始化示例 */
{
my_class * my = new(my_class);
my->set_a(my, 200);
printf("my->_a = %d/n", my->get_a(my));
delete(my);
}
/* 栈空间初始化示例 */
{
my_class me;
CALL_CLASS_CREATE(my_class, &me);
me.set_a(&me, 200);
printf("me._a = %d/n", me.get_a(&me));
}
return 0;
}
这样以后在定义自己的类时,只需要在project中包含class.h和class.c两个文件 。。就可以参照my_class的定义实现自己的类。
并且这个类是纯虚结构的。。。