1.**在面向对象的语言里面,出现了类的概念。类是对特定数据的特定操作的集
合体。类包含了两个范畴:数据和操作。而C语言中的struct仅仅是数据的
集合,我们可以利用函数指针将struct模拟为一个包含数据和操作的”类”。**
2.用C程序模拟一个最简单的“类”
**#define C_Class 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();
break;
case MENU2:
menu2OnOk();
break;
…
}
}
/* 按下Cancel键*/
void onCancelKey()
{
/* 判断在什么焦点菜单上按下Cancel键,调用相应处理函数*/
Switch(currentFocus)
{
case MENU1:
menu1OnCancel();
break;
case MENU2:
menu2OnCancel();
break;
…
}
}
//使用C面向对象的方法
/* 将菜单的属性和操作“封装”在一起,声明菜单项的“类”*/
typedef struct tagSysMenu
{
char *text; /* 菜单的文本*/
BYTE xPos; /* 菜单在LCD上的x坐标*/
BYTE yPos; /* 菜单在LCD上的y坐标*/
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, menu3OnOk, menu3OnCancel }
…
};
/* 按下OK键*/
void onOkKey()
{
menu[currentFocusMenu].onOkFun();
}
/* 按下Cancel键*/
void onCancelKey()
{
menu[currentFocusMenu].onCancelFun();
}
**
1.程序被大大简化了,也开始具有很好的可扩展性!
2.利用了面向对象中的封装思想,使程序结构清晰,其结果是几乎可以在无需
修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不
变。
**