本帖最后由 vsfopen 于 2020-2-12 15:47 编辑
首先,最终要的一点,OO的概念是流淌在开发者的血液里的(我的一个朋友的原话),并不是在语言层面的概念。也就是说,用C++的OO外壳,同样可以做出非OO的代码;用C语言,也一样可以写出OO的代码。这里说一下OOPC的发展,有遗漏的可以回帖指正。
一、基本实现原理
1. 直接结构体
xxx.h
struct some_class_t {
// public member
int a;
// private member
int b;
};
extern int some_class_func(struct some_class_t *class, ......);
这里,相当于人工传入OO代码里的this指针。
这里,对于some_class_t,用户完全可见,不存在实质对private和public成员的保护。然后,由于用户可以知道大小信息,所以,也可以不用动态分配。
优点:简单,具备思想就可以开发。代价非常小
缺点:无实质保护
2. typedef隐藏结构体信息
xxx.h
typedef struct some_class_t some_class_t;
extern some_class_t * some_class_new(......);
extern int some_class_func(struct some_class_t *class, ......);
xxx.c:
struct some_class_t {
// public member
int a;
// private member
int b;
};
some_class_t * some_class_new(......)
{
some_class_t *xxx = malloc(...);
....
return xxx;
}
这里,可以通过typedef隐藏结构体力的所有信息,相当于全私有,成员都通过getter和setter访问。
优点:具备保护能力
缺点:用户层只能调用new来动态分配,因为不知道隐藏的结构体大小信息。代价较大
3. 掩码结构体
xxx.h:struct some_class_t {
int a;
#ifdef SOME_CLASS_IMPLEMENT
struct {
int b;
};
#else
uint8_t __private_member[
sizeof(struct {
int b;
})
];
#endif
};
#undef SOME_CLASS_IMPLEMENT
xxx.c
#define SOME_CLASS_IMPLEMENT
#include "./xxx.h"
......
这里的代码只是简化实现,这个实现对编译支持来说是有问题的。这里只是为了比较清楚的展示原理。
xxx.c的实现代码里,通过定义SOME_CLASS_IMPLEMENT,来得到private成员的可见性。用户代码里,不会定义这个,所以用户看到的只是一个__private_member数组,看不到私有成员b。
优点:用户可以看到类结构的大小,不必须动态分配,成员具备访问控制
缺点:需要辅助语法糖来简化用户开发,引入额外的结构体,会有内存对齐时候,额外的内存间隙。
|