C的面向对象化

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.利用了面向对象中的封装思想,使程序结构清晰,其结果是几乎可以在无需
修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不
变。
**

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值