如何用C程序模拟一个最简单的类
在面向对象的语言中出现了类的概念,类是对特定的数据的特定操作的集合体。类包含了两个范畴:数据和操作。而C语言中的struct仅仅是数据的集合,我们可以利用函数指针将struct模拟为一个包含数据和操作的“类”。
具体代码实现如下
#define C_Class struct /*宏定义给struct命名*/
C_Class A
{
C_Class A *A_this; /*同种类型的this指针*/
void(*foo)(C_Class A *A_this); /*行为:函数指针*/
int (*parea)(int length, int width);
int a; /*数据*/
int b;
}
这样做的有什么好处呢?来看一个简单的例子
例:菜单操作
要求通过控制键盘上的方向箭头切换菜单光标,当用户在光标处于某菜单时,若敲击键盘上的OK、CANCEL键调用该光标对应的处理函数。
方法一
/*按下OK键*/
void onOkKey()
{
/*判断在光标在什么菜单上按下OK键,调用相应处理函数*/
Switch(currentFocus)
{
case MENU1:
menu1OnOk();
berak;
case MENU2:
menu2OnOk();
berak;
...
}
}
/*按下CANCEL键*/
void onCancelKey()
{
/*判断在光标在什么菜单上按下CANCEL键,调用相应处理函数*/
Switch(currentFocus)
{
case MENU1:
menu1OnCancel();
berak;
case MENU2:
menu2OnCancel();
berak;
...
}
}
如果要增减菜单项则需要修改两个函数
方法二:
/*将菜单的属性和操作封装在一起,声明菜单项的类*/
typedef struct tagSysmenu
{
char *text; /*菜单的文本*/
BYTE xpos; /*菜单在LCD上的x坐标*/
BYTE ypos; /*菜单在LCD上的x坐标*/
void (*onOkFun)(); /*在该菜单上按下Ok键的处理函数*/
void (*onCancelFun)(); /*在该菜单上按下Cancel键的处理函数*/
}SysMenu,*LPSysMenu;
/*用结构体数组来实现每一个菜单项*/
static SysMenu menu[MENU_NUM] =
{
{
"menu1",0,48,menu1onOk,menu1onCancel}
{
"menu2",7,48,menu2onOk,menu2onCancel}
{
"menu3",14,48,menu2onOk,menu2onCancel}
...
};
/*按下Ok键*/
void onOkKey()
{
menu[CurrentFocusMenu].onOkFun();
}
/*按下Cancel键*/
void onCancelKey()
{
menu[CurrentFocusMenu].onCancelFun();
}
方法二的程序被大大简化,也具有很好的可扩展性
利用面向对象的封装思想,使程序结构清晰,其结果是在几乎可以在无需修改程序的条件下在系统中添加更多的菜单,而系统的按键处理函数保持不变。