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

h5建站工具名师工作室网站建设建议

h5建站工具,名师工作室网站建设建议,建站网站图片不显示,织梦怎么做单页网站从整体来看&#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/813270/

相关文章:

  • 图片网站模版论坛网站制作
  • 多张图片排版设计欣赏杭州上城区抖音seo有多好
  • php做的购物网站系统下载网站同时做竞价和优化可以
  • 网站做宣传域名什么好wordpress页面教程视频教程
  • 学风建设网站wordpress树莓派
  • 温州门户网站建设网站推广有用吗?
  • 手机网站 动态 页面 好 静态页面好做模版的网站
  • asp企业网站模板网站制作涉及的法律
  • 管理咨询合同广东企业网站seo点击软件
  • 西安知名网站推广浦东新区做网站公司
  • 公司网站设计制作开发方案济南网站建设公司电子商务网站
  • 黑龙江网站备案地址为企业做贡献演讲稿
  • 不需要iis的网站开发网站维护主要是做哪些
  • 网站开发卖东西网站 建设理由
  • 扬中网站建设管理网站建设源代码程序
  • 山西省建设厅招标网站首页wordpress搜索 主题
  • 西安网站设计建设公司 交通wordpress安装dplayer
  • 如何做论坛网站 知乎做淘宝客网站要申请什么
  • 水务 网站建设近三天新闻50字左右
  • 深圳整站全网推广企业运营实训报告
  • 长春网站优化体验企业对公账户查询系统
  • 医院网站建设水平给特宝网站商家网址怎样做
  • 双牌网站建设广东专业网站建设公司
  • 重庆做商城网站建设网络公司起名大全免费
  • 吉林省住房和城乡建设厅网站申报企业网站做百度排名要怎么做
  • 网站建设如何赚钱公司法人查询
  • 某个网站访问慢的原因湖南网站seo推广
  • 佛山网站制作专家网站系统分析
  • 深圳网站程序开发制作平台手机app开发
  • 漳州城乡建设局网站首页有客多小程序