您的位置 首页 元件

关于嵌入式C言语的圈套与技巧

关于嵌入式C语言的陷阱与技巧-结合C语言的指针和结构体语法,基本能够实现对象语法最核心的部分,即成员函数和成员变量。另外,上一节讨论了如何利用指针,将公开的成员变量,封装成 private(私有)变量,由此也可以看出C语言指针语法的强大。

结合C言语的指针和结构体语法,根本可以完结目标语法最中心的部分,即成员函数和成员变量。别的,上一节评论了怎么运用指针,将揭露的成员变量,封装成 private(私有)变量,由此也可以看出C言语指针语法的强壮。

将不同的模块封装成独立的类是便利的,不过在实践的C言语项目开发中,即使是独立的类之间也是极有或许存在通用功用的。例如各个类都用得到时刻,所以在界说类时,需求为各个类都增加获取时刻的成员函数:

struct class1{//…long (*get_time)();};struct class2{//…long (*get_TIme)();};上面这段C言语代码界说了 class1 和 class2 两个类作为示例,假如 class1 和 class2 对时刻的要求并没有什么不同,那咱们可以让二者的 get_TIme 函数指针指向同一个函数,例如:

long get_TIme(){//…}struct class1 c1 = {…, get_TIme};struct class1 c2 = {…, get_time};这么做无可厚非,横竖完结了 class1 和 class2 的一起功用。不过,在实践的C言语项目开发中,更常见的状况是,有些类具有的一起功用不止一个。

例如class1 和 class2 不只都需求获取时刻,也都需求打印功用,这样一来,在界说 class1 和 class2 时,就需求再新增一个成员函数,相关C言语代码如下:

struct class1{//…long (*get_time)();void (*print)(void *data);};struct class2{//…long (*get_time)();void (*print)(void *data);};假如 class1 和 class2 需求的打印功用没有差异,那么在初始化目标时,就可以像上面的 get_time 相同,让 print 指向现已完结的打印函数就可以了。

关于嵌入式C言语的圈套与技巧

long get_time(){//…}void myprint(void *data){//…}struct class1 c1 = {…, get_time, myprint};struct class1 c2 = {…, get_time, myprint};

乍一看,上面这种操作方法没有什么缺点,相同功用实践由一个函数完结,没有形成资源糟蹋。可是关于类 class1 和 class2 自身来说,将自己的独有特性和与其他类一起特性封装在一起,就不太正确了。别的,各个类中有重复的函数指针也是在实践C言语项目开发中应该极力防止的。

已然决议进行“面向目标”编程,要处理上述问题,天然应该参阅其他具有原生目标语法的高档编程言语。在开发C++程序封装类时,遇到各个类的相同特性,常常将这些相同特性提取出来,作为一个新的类。这个新的类常被称作“父类”,而且经过C++的承继语法,将“父类”的成员函数和成员变量同享给需求的子类。

C言语没有供给原生的目标语法,也没有供给承继语法。可是咱们依然可以运用C言语的指针和结构体语法模仿“父类”概念和“承继”特性。首要,将各个类的相同特性提取出来,并将这些特性封装为“父类”是简略的。仍是以 class1 和 class2 为例,它们有两个相同功用:获取时刻和打印功用。

struct father{long (*get_time)();void (*print)(void *data);};上述C言语代码将 class1 和 class2 的一起功用封装成一个新的类 father,也即所谓的“父类”。接下来,只要让 class1 和 class2 承继 father 就可以了,可是C言语没有原生的“承继”语法,该怎样完结这一进程呢?

应理解,承继的意图是为了让子类可以拜访父类供给的成员函数和成员变量,尽管C言语没有像C++那样完善的承继语法,可是像供给子类拜访父类这种需求仍是比较简略完结的:

struct class1{//…struct father father;};struct class2{//…struct father father;};正如上述C言语代码,直接将 father 塞入 class1 和 class2 其实就可以了。拜访父类的成员函数是简略的:struct class1 c1;c1.father.print(data);

一个值得阐明的小技巧是,假如 father 类比较大,占用资源比较多,而C言语程序又没有必要树立多个 father 副本,则可以将 class1 和 class2 中的父类修改为指针:struct class1{//…struct father *father;};struct class2{//…struct father *father;};这样一来,不管 father 有多大,class1 和 class2 都能运用一个指针巨细的内存空间去索引它。拜访父类的成员函数与之前有少许差异:

struct class1 c1;c1.father->print(data);到这儿,信任读者应该可以发现,结合C言语的结构体和指针,模仿“面向目标”编程的父类承继语法也是垂手可得的,这也从旁边面阐明晰C言语指针的强壮。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/98470.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部