用C结构体来实现面向对象编程,ti xDAIS标准算法就这么搞的。

测试代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct Alg_Obj{
  5. struct Alg_Fxn* fxns;
  6. }Alg_Obj;
  7. typedef Alg_Obj *Alg_Handle;
  8. typedef struct Alg_Fxn{
  9. void (*process)(Alg_Handle handle);
  10. void (*control)(Alg_Handle handle);
  11. }Alg_Fxn;
  12. void Alg_process(Alg_Handle handle)
  13. {
  14. handle->fxns->process(handle);
  15. printf("in Alg_process.. \n");
  16. }
  17. void Alg_control(Alg_Handle handle)
  18. {
  19. handle->fxns->control(handle);
  20. printf("in Alg_control.. \n");
  21. }
  22. struct triangle{
  23. Alg_Handle handle;
  24. int a;
  25. int b;
  26. int c;
  27. };
  28. void tri_process(Alg_Handle handle)
  29. {
  30. struct triangle *t = (struct triangle*)handle;
  31. int a = t->a;
  32. int b = t->b;
  33. int c = t->c;
  34. printf("  [in tri_process] sum=%d\n",a+b+c);
  35. }
  36. void tri_control(Alg_Handle handle)
  37. {
  38. struct triangle *t = (struct triangle*)handle;
  39. int a = t->a;
  40. int b = t->b;
  41. int c = t->c;
  42. printf("  [in tri_control] sum=%d\n",(a+b+c)*2);
  43. }
  44. Alg_Fxn gfxns = {
  45. tri_process,
  46. tri_control,
  47. };
  48. int main()
  49. {
  50. struct triangle *ret = (struct triangle*)malloc(sizeof(struct triangle));
  51. ret->handle->fxns=&gfxns;
  52. ret->a = 2;
  53. ret->b = 3;
  54. ret->c = 4;
  55. Alg_Handle Handle= (Alg_Handle)ret;
  56. //第一种调用,注意结果
  57. gfxns.process(Handle);
  58. gfxns.control(Handle);
  59. printf("\n**********************************\n");
  60. //第二种调用,注意结果
  61. Alg_process(Handle);
  62. Alg_control(Handle);
  63. free(Handle);
  64. return 0;
  65. }
  66. /*
  67. [root@localhost TestCode]# ./a.out
  68. [in tri_process] sum=9
  69. [in tri_control] sum=18
  70. **********************************
  71. [in tri_process] sum=9
  72. in Alg_process..
  73. [in tri_control] sum=18
  74. in Alg_control..
  75. */

此代码在ubuntu下运行还是有点问题出现两个类似的段错误,估计是野指针和未分配内存的缘故!

第一个解决:

ret->handle=(Alg_Handle)malloc(sizeof(Alg_Handle));

第二个:

我干脆把改了之后的完整代码贴上吧!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Alg_Obj{
struct Alg_Fxn *fxns;
}Alg_Obj;

typedef Alg_Obj *Alg_Handle;

typedef struct Alg_Fxn{
void (*process)(Alg_Handle handle);
void (*control)(Alg_Handle handle);
}Alg_Fxn;

struct triangle{
Alg_Handle handle;
int a;
int b;
int c;
};
void tri_process(Alg_Handle handle)
{
struct triangle *t = (struct triangle*)handle;
int a = t->a;
int b = t->b;
int c = t->c;
printf(" [in tri_process] sum=%d\n",a+b+c);
}
void tri_control(Alg_Handle handle)
{
struct triangle *t = (struct triangle*)handle;
int a = t->a;
int b = t->b;
int c = t->c;
printf(" [in tri_control] sum=%d\n",(a+b+c)*2);
}
void Alg_process(Alg_Handle handle)
{
struct triangle *ret= (struct triangle *)malloc(sizeof(struct triangle));
ret->handle=(Alg_Handle)malloc(sizeof(Alg_Handle));
ret->handle->fxns=(struct Alg_Fxn*)malloc(sizeof(struct Alg_Fxn));
ret->handle->fxns->process=(Alg_Handle *)malloc(sizeof(Alg_Handle));
ret->handle->fxns->process=tri_process;
ret=handle;
ret->handle->fxns->process(ret);
printf("in Alg_process.. \n");
}

void Alg_control(Alg_Handle handle)
{
struct triangle *ret= (struct triangle *)malloc(sizeof(struct triangle));
ret->handle=(Alg_Handle)malloc(sizeof(Alg_Handle));
ret->handle->fxns=(struct Alg_Fxn*)malloc(sizeof(struct Alg_Fxn));
ret->handle->fxns->control=(Alg_Handle *)malloc(sizeof(Alg_Handle));
ret->handle->fxns->control=tri_control;
ret->handle->fxns->control(ret);
//handle->fxns->control(handle);
printf("in Alg_control.. \n");
}
Alg_Fxn gfxns = {
tri_process,
tri_control,
};
int main()
{
struct triangle *ret= (struct triangle *)malloc(sizeof(struct triangle));
ret->a = 2;
ret->b = 3;
ret->c = 4;
ret->handle=(Alg_Handle)malloc(sizeof(Alg_Handle));
ret->handle->fxns=&gfxns;
Alg_Handle Handle= ret;
//第一种调用,注意结果
gfxns.process(Handle);
gfxns.control(Handle);
printf("\n**********************************\n");
//第二种调用,注意结果
Alg_process(Handle);//Handle
Alg_control(Handle);
//free(Handle);
return 0;

}

用C结构体来实现面向对象编程,ti xDAIS标准算法就这么搞的(1)的更多相关文章

  1. C语言:使用结构体和指针函数实现面向对象思想(OO编程)

    原文:https://www.linuxidc.com/Linux/2016-12/138789.htm 有关:<C语言:过年回家 发现只有我没有对象> 一.基础研究 观察如下两个程序a. ...

  2. c语言里用结构体和指针函数实现面向对象思想

    一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...

  3. 【C/C++编程入门学习】C语言结构体硬核玩法分享,一切皆是数据!

    前言 对于结构体的应用太多了,今天这篇文章我主要为大家总结平时关于结构体的一些独特硬核小技巧,对于结构体更多优秀的编程表现,如果你对结构体的基础知识还不具备的话得回头看一下专栏教程或者自己找本书籍学习 ...

  4. swift 的枚举、结构体、类

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  5. Go语言中结构体的使用-第2部分OOP

    1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...

  6. iOS学习笔记44-Swift(四)枚举和结构体

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  7. Swift结构体与类

    在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...

  8. Java基础--面向对象编程1(类与对象)

    1.类(class)的定义 类是对一组具有相同特征和行为的对象的抽象描述. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物. 2.对象(object)的定义 对象是类的具体实现 ...

  9. Go第六篇之结构体剖析

    Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类型可以被实例化,使用new或&a ...

随机推荐

  1. mysql - 在已有真实数据的表的基础上加入自增主键

    先删除自增长在删除主键Alter table tb change id id int(10);//删除自增长Alter table tb drop primary key;//删除主建 然后再常规添加 ...

  2. Win8.1的IE11无法打开,必须使用管理员身份运行

    不知道大家有没有遇到这种情况,在毫不知情的情况下 IE11 突然打不开了,必须要用管理员身份运行才可以打开,而且重置浏览器这个方法也不奏效. 今天本人也遇到了,上网查找发现是注册表权限的问题,原因尚不 ...

  3. HTML5游戏实战之精灵翻转

    要实现精灵的翻转.很easy.先看实际效果点这里. 代码仅仅有区区几行: var sp = this.getWindow().find("ui-status2-general"); ...

  4. Android开发之控制摄像头拍照

    如今的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦.光学变焦这些仅仅有单反才有的功能,甚至有些手机直接宣传能够拍到星星.能够说手机已经变成了专业数码相机.为 ...

  5. 如何进行SVN数据迁移并保存版本号数据

    如何从一台服务器192.168.8.2迁移到另一台服务器192.168.8.30进行SVN数据迁移并保存版本号数据 工具/原料   SVN 方法/步骤   1 打开远程服务,连接192.168.8.2 ...

  6. 强者联盟——Python语言结合Spark框架

    引言:Spark由AMPLab实验室开发,其本质是基于内存的高速迭代框架,"迭代"是机器学习最大的特点,因此很适合做机器学习. 得益于在数据科学中强大的表现,Python语言的粉丝 ...

  7. Linux Awk使用案例总结(nginx日志统计,文件对比合并等)

    知识点: 1)数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常称为键,数组元素的键和值存储在Awk程序 ...

  8. Install haroopad on centos7

    1.Install libs sudo yum install systemd-libs -y 2.Download haroopad goto haroopad1 download bin pack ...

  9. js 图表插件 chartjs 2.4

    PS:该图表插件对手机端支持挺好 网上的文章大多数的参数都是老版本的过时的,最新api查看官网http://www.chartjs.org/docs/  下载地址 https://github.com ...

  10. Java 命令行运行java程序,出现“找不到或无法加载主类 ”的注意事项

    引用:http://blog.chinaunix.net/uid-27106528-id-5209914.html 要在CMD命令行中使用java 运行java程序,关于出现 “找不到或无法加载主类 ...