什么建设网站好,wordpress手动升级插件,wordpress计算几岁几月几天,wordpress怎么念面向对象的三个特征#xff1a;封装#xff0c;继承#xff0c;多态。但是C语言不是面向对象编程语言#xff0c;所以需要借助一些技巧来实现这三个特征#xff1a;#xff08;1#xff09;C语言没有成员函数#xff0c;struct只能封装数据#xff0c;不能封装方法封装继承多态。但是C语言不是面向对象编程语言所以需要借助一些技巧来实现这三个特征1C语言没有成员函数struct只能封装数据不能封装方法可以在struct里使用函数指针2C语言不支持继承可以在一个struct里包含另一个struct3C语言也没有虚函数实现多态就更麻烦了我不会。举个例子现在有Point结构体定义如下struct Point{float x; float y;
};如果想从Point派生出Circle可以这么写struct Circle{ struct Point o; //圆心 float r; //半径};
struct Circle C;struct Point *pPoint (struct Point*)(C);此时如果将Circle类型的指针强制换换成Point类型指针因为内存是顺序连续的所以没问题pPoint-x访问的是C.o.xpPoint-y访问的是C.o.y.也就是说在需要基类指针的地方可以传入派生类的指针。 但是如果将o和r的顺序换一下就错了。struct Circle{ float r; //半径 struct Point o; //圆心};
struct Circle C;struct Point *pPoint (struct Point*)(C);//这么转会出问题简单来说就是如果想使用C语言的继承那么基类对象一定要写在派生类的最前面但是对C语言编程而言不建议使用继承和多态使用封装就可以了。对封装的理解可以退化为不直接访问结构体的成员变量而是通过函数去访问C语言没有private属性直接访问成员变量总是可以的但是不建议这么做此外C语言结构体没有this指针所以使用函数指针封装方法也用的比较少更多的是提供一些全局函数将结构体指针作为参数传进去操作。 假设有个Moubus数据包的结构体#define PACK_SIZE 256
struct ModbusPack{ uint8_t data[PACK_SIZE]; uint8_t len;};
还有和它对应的操作函数void Modbus_init(struct ModbusPack *pThis);
void Modbus_append(struct ModbusPack *pThis,uint8_t v);
void Modbus_appends(struct ModbusPack *pThis,uint8_t *vs,uint8_t len);
uint8_t Modbus_len(struct ModbusPack *pThis);
void Modbus_append_crc(struct ModbusPack *pThis);
uint8_t Modbus_check(struct ModbusPack *pThis);
void Modbus_init_query(struct ModbusPack *pThis,uint8_t addr,uint8_t fc,uint16_t regbase,uint16_t regNum);
void Modbus_print(struct ModbusPack *pThis);
对于Modbus_len这个函数的实现如下uint8_t Modbus_len(struct ModbusPack *pThis) {//省略对指针是否为空的判断 return pThis-len;
}
看起来比直接访问成员变量复杂好处在于当修改了ModbusPack的实现将len改为m_len,则只需要修改Modbus_xxx函数就行了不影响其他地方对这个函数的调用因为调用的地方只依赖于这个函数的名字而不需要知道相应结构体的具体实现。struct ModbusPack{ uint8_t m_data[PACK_SIZE]; uint8_t m_len;};
uint8_t Modbus_len(struct ModbusPack *pThis) { //省略对指针是否为空的判断 return pThis-m_len;}
简单的使用例子如下#include modbus.h
int main(){ struct ModbusPack pack; Modbus_init(pack);//C语言没有构造函数,通过初始化函数初始化对象 Modbus_init_query(pack,0x01,0x03,0x0000,0x0002); Modbus_print(pack); return 0;}
运行结果友情提示找对象虽易面向对象不易且行且珍惜。声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。