如何用C程序模拟一个最简单的类

如何用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();
}

方法二的程序被大大简化,也具有很好的可扩展性
利用面向对象的封装思想,使程序结构清晰,其结果是在几乎可以在无需修改程序的条件下在系统中添加更多的菜单,而系统的按键处理函数保持不变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值