上一篇文章提到的Lua的对象系统,是C语言实现面向对象的一个典范。但对于大部分工程项目来说,没有必要实现的那么复杂。这里介绍我采用的一个方案。
首先,可以设计一个结构体,用于整个模块的管理,结构体可以直接命名为模块名,该结构体最好定义在.c
文件中。
一个功能模块内,可能需要有多个类引出,类的定义最好都放在.c
文件中,以做到内部逻辑的隐藏。
//管理整个模块
struct module{
....
};
//模块内的类
struct subset{
....
};
整个模块需要加载到项目中,所以需要实现一个初始化函数,模块的卸载不是必须的(按经验,应该是没有必要的)。
需要提供各个类的构造、析构,调试接口,以及get,set方法。
需要声明一下需要导出的类,因为只是声明没有定义,外部调用只能持有类的指针,不能访问类的成员,这做到了面向对象的封装性。
struct subset;
int module_init();
//构造
struct subset *subset_create();
//析构
void subset_release(struct subset *);
//调试
void subset_debug();
//get set 方法
int subset_get_id(struct subset *);
int subset_set_id(struct subset *,);
一般情况下,模块还有一些逻辑要实现,模块的逻辑实现,我们围绕着模块管理这个结构体来做。
struct moudle{
list *subset; //组织模块内需要管理的类
...
};
struct module *M = NULL;
//单例实现
int moudle_init(){
if(M == NULL){
M = malloc(sizeof(*M));
.....
}
}
//模块内逻辑,返回值为错误码,一般0代表成功,-1代表失败
int module_xx_xx(struct subset*,... );//第一个xx是动词,第二个xx是名词
如果模块比较复杂,可以增加一个错误提示单元(往往并不需要)
enum{
MODULE_OK,
MODULE_ERROR,
MODULE_FAIL
};
static const char* ErrorMsg[] = {
"module_ok",
"module_error",
"module_fail",
};
const char *module_error(int errcode){
return ErrMsg(errcode);
}
以上。