当前位置: 首页 > news >正文

扁平式的网站徐州网站制作建设

扁平式的网站,徐州网站制作建设,关于网站开发费用的入账,伯才建筑人才网从整体来看&#xff0c;笔者的做法与之前的模拟多态十分相似&#xff0c;毕竟c多态的实现与虚函数密切相关 废话少说&#xff0c;see my code&#xff1a; kernel.c#include "kernel.h" #include <stdio.h>void shape_draw(struct shape_t* obj) {/* Call dr…

从整体来看,笔者的做法与之前的模拟多态十分相似,毕竟c++多态的实现与虚函数密切相关

废话少说,see my code:

kernel.c#include "kernel.h"
#include <stdio.h>void shape_draw(struct shape_t* obj) {/* Call draw of the real Instance */obj->vtable->draw();}
kernel.h:#ifndef UNTITLED_KERNEL_H
#define UNTITLED_KERNEL_Hstruct shape_t {/*Virtual Method Table */const struct shape_interface* const vtable;
};struct shape_interface {void (*draw)();};void shape_draw(struct shape_t* obj);//obj->vtable->draw();#endif //UNTITLED_KERNEL_H
try.c:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "try.h"void draw() {printf("error is try!\n");
}void draw1() {printf("error is try2!\n");
}struct shape_t* shape_create_rectangle() {//直接赋值,这里有个命名错误,跟gcc有关://static const struct shape_interface_t vtable = { draw1 } ;//static struct shape_t base = { &vtable };//笔者认为给结构体成员赋值,下面的写法更妥当static const struct shape_interface vtable = { .draw = draw1} ;static struct shape_t base = { .vtable = &vtable};//推荐上面这种写法,因为某些编译器很有趣struct rectangle_t* rectangle = malloc(sizeof(*rectangle));memcpy(&rectangle->base, &base, sizeof(base));return (struct shape_t*)(&rectangle->base);
}

顺便一提,clion的编译器相当有趣

笔者在之前曾经写错了shape_interface (_t)结构体名称,但是笔者发现:

//static const struct shape_interface_t *vtable = { draw1 } ;
//static struct shape_t base = { &vtable };

改成这样也能运行

这是为什么呢?笔者推测,gcc应该是无法找到对于结构体,就把vtable当成了数组,加上*就成为了数组。然后&vtable就成为了二级指针,由于draw1本身就是一个指针,把它转成空指针什么的可以随便赋值。gcc在找不到对应结构体后,索性为base里的vtable开辟了一段空间,由于&vatble是二级指针,但是找不到对应地址指向,可能它在编译过程中被转为了一级空指针,且等于draw1本身,这样就能解释通了。(如果有c语言高手可以留言解答一下,笔者对c语言和编译器的处理所知甚少)

try.h:#ifndef UNTITLED_TRY_H
#define UNTITLED_TRY_H#include "kernel.h"struct rectangle_t {struct shape_t* base; /* Reference to Base Class *//* Rectangle specific Members */int x;int y;
};struct shape_t* shape_create_rectangle();#endif //UNTITLED_TRY_H

在主函数中这样调用即可:

main.c:#include "try.h"
#include "kernel.h"int main() {struct shape_t* rectangle = shape_create_rectangle();shape_draw(rectangle);return 0;
}

接下来是重点,虚函数表的实现,可以适当改动try.c文件:

try.c://
// Created by el on 2024/8/16.
//#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "try.h"void draw() {printf("error is try!\n");
}void draw1() {printf("error is try2!\n");
}struct shape_t* shape_create_rectangle() {//static const struct shape_interface *vtable[] = { draw , draw1 } ;static const struct shape_interface_t *vtable[] = { .vtable = draw} ;static struct shape_t base = { vtable + 1};struct rectangle_t* rectangle = malloc(sizeof(*rectangle));memcpy(&rectangle->base, &base, sizeof(base));return (struct shape_t*)(&rectangle->base);
}

使用函数指针数组,就可以模拟出比较相近的虚函数表。

整个c程序的UML图如下:

UML

其实这张图跟笔者前一篇模拟多态的文章思想是一样的。

http://www.yayakq.cn/news/857900/

相关文章:

  • 湖州网站建设哪家好网站备案号在哪里查询
  • 做电锯电音的网站网络seo关键词优化技巧
  • 印刷网站建设大学生做社交网站有哪些
  • iis 网站 500徐州市网站开发
  • 广州企业网站建设价格网站建设创新能力痛点
  • 小程序导航网站开发wordpress 图片选择
  • 网站开发电商shopify网站建设
  • 做海报有哪些网站wordpress手动安装主题
  • 陕西省建设监理协会证书查询网站phpcms v9网站模板
  • 做防水保温怎么建网站成都的网站
  • 定远建设局网站微信模板怎么制作
  • 佛山网站设计讯息网站建设对于企业的必要性
  • 建网站打开需要验证深圳做服装设计网站的公司
  • 门户型网站建设方案汕头做网站优化哪家好
  • 怎么做美食团购网站网络营销课程设计计划书
  • 广州做网站哪里好信息流广告代运营
  • 精美网站建设做网站的知识
  • 网站开发环境有哪些phpapp安装软件
  • 教研室网站建设清水河网站建设
  • 做网站的公司应该税率多少住房和城乡建设部政策研究中心
  • 惠州市建设规划局网站网站建设组织架构
  • 品牌网站建站目的wordpress文章发布编辑器
  • 苏州网站建设 江苏千渡wordpress cosy主题2.05
  • 6黄页网站建设七牛镜像存储wordpress
  • 公司建设网站怎么做账jquery网站后台
  • 哇哈哈网站建设策划书网站制作二维码
  • nginx wordpress建站河北省建设厅工程信息网站
  • 成都企业建设网站网站数据库连接出错
  • 如何制作简单网站google海外版
  • 做网站标题著名网站设计师