用C写有面向对象特点的程序
比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C++中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后),而其算法可以写在你类中的虚函数中,供子类使用。如:
class Links
{
public:
Links* back;
Links* forword;
virtual Add(){ ... };
virtual Del(){ ... };
virtual Ins(){ ... };
virtual Print() =0;
....
};
于是对于特定的数据结构我们可以:
class mylinks : public Links
{
public:
char* myname;
char sex;
int age;
...
virtual Print(){ .... }
};
对其操作时都可以使用你类的泛型算法。
在C中,该如何做呢?我们用C中的指针和强制类型转可以做到。
下面是我总结出来的一个小的程序,体现了用指针的弹性来实现这一继承的效果:
(我在Liniux下的GCC调试通过)
=======================================
#include <stdio.h>
/* 双向链表 (类似于父类)*/
typedef struct hLinks{
struct hLinks *bwLink;
struct hLinks *fwLink;
} hLinks;
/*
* 一个使用双向链表的结构
* (类似于子类)
*/
typedef struct hEnt{
hLinks links;
int hData;
char key[10];
} hEnt;
/*
* 双向链插入泛型算法 (类似于父数中的成员函数)
*/
Insert( hLinks* elem, hLinks *dest )
{
if ( !elem || !dest ) return;
elem->bwLink = dest->bwLink;
elem->fwLink = dest;
dest->bwLink->fwLink = elem;
dest->bwLink = elem;
}
/*
* 打印 (类似于子类重载父类的成员函数)
*/
PrintLink( hLinks *h )
{
hEnt *p ;
for( p = ( hEnt* ) h->fwLink; /* <-----------把hLink再转回来 */
p != ( hEnt* ) h;
p = ( hEnt* )( (hLinks*)p )->fwLink )
{
printf("hData=[%d], key=[%s]/n", p->hData, p->key);
}
}
main()
{
hLinks head;
hEnt a[4];
int i;
head.bwLink = &head;
head.fwLink = &head;
for(i=0;i<4;i++)
{
a[i].hData = i*10;
sprintf(a[i].key,"id=%d", i);
/* 使用泛型算法构造双向链 */
Insert( (hLinks *) &a[i], (hLinks *) &head ); /* <-----注意这个强制转换 */
}
PrintLink( (hLinks *) &head ); /* <-------也注意这个强制转换 */
}
其实,C++就是把C++翻译成C,再编译,所以编译好慢。我这里的这个动作可能类似C++转成C后的样子吧
用C写有面向对象特点的程序的更多相关文章
- python面向对象编程小程序- 选课系统
选课系统 花了一晚上写的,可能还存在不足 1.程序框架 2.文件夹建立 D:/选课系统 |___api | |___common_api.py |___bil | |___common.py |___ ...
- c语言里用结构体和指针函数实现面向对象思想
一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...
- C语言:使用结构体和指针函数实现面向对象思想(OO编程)
原文:https://www.linuxidc.com/Linux/2016-12/138789.htm 有关:<C语言:过年回家 发现只有我没有对象> 一.基础研究 观察如下两个程序a. ...
- C语言结构体的强制类型转换
陈浩师兄03年的一篇博客<用C写有面向对象特点的程序>描述了用C语言来实现类似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换 ...
- JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...
- python基础(八)面向对象的基本概念
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对 ...
- php面向对象学习笔记
PHP 面向对象技术(全面讲解) Ø 主要内容 v 1.面向对象的概念 v 2.什么是类,什么是对象,类和对象之间的关系 v 3.什么是面向对象编程呢? v 4.如何抽象出一个类? v 5.如何实例化 ...
- Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一 三个基本的特性:封装.继承与多态1 1.2. 魔 ...
随机推荐
- 循环插入oracle 存储过程
-- Create tablecreate table STUDENTS( name VARCHAR2(300), id NUMBER(11), city VARCHAR2(300), no VARC ...
- @TargetAPI + 版本判断实现高低API版本兼容
安卓开发中,在低版本SDK使用高版本的API会报错.一般处理方法是换一种实现方法,或者在高版本SDK中使用高版本API,低版本SDK中使用效果可能会差点的折衷方案:后者可以用如下技巧来实现. 步骤 S ...
- asp.net 常用于客户端注册的机器信息
项目需要:根据客户端信息去获取用户登录信息 1.根据客户端信息,并查询数据库是否有匹配.如果没有则重新插入客户端信息: 2.根据客户端的设置提交用户登录信息,用户登录成功后,查询以前是否有过配置信息, ...
- LintCode:Fibonacci
C++ class Solution{ public: /** * @param n: an integer * @return an integer f(n) */ int fibonacci(in ...
- robot framework-databaselibaray库使用(python)
公司做项目用到了databaselibaray,刚开始使用时碰到了很多问题,网上也查阅了很多资料终于是可以用了,现在整理记录下来,有需要的同学可随意使用: 另,本文主要是databaselibaray ...
- Spring Jdbc事例说明(三)
上一篇文章已经讲解了如何使用Spring搭建工程,这一篇文章是接着上一篇文章来描述的. 一.载入依赖 新增加了两个依赖,mysql数据库驱动和alibaba数据源包 <!-- mysql驱动包 ...
- flume-elasticsearch-sink indexName
- IIS 管理器无法验证此内置帐户是否有访问权
解决办法:1.打开iss管理器2.点击网站——localhost3.点击右上角位置的"基本设置"——"链接为"——"特定用户"——" ...
- CPLSetErrorHandlerEx函数Bug
CPLSetErrorHandlerEx(gdal/gdal/port/cpl_error.cpp,当前github中代码)当前函数实现如下 CPLErrorHandler CPL_STDCALL C ...
- Android 自定义控件-高仿猎豹清理大师自定义内存开口圆环控件
技术:Android+java 概述 看见猎豹清理大师的内存开口圆环比例进度 挺有意思的,于是就是想自己实现下这样的效果,于是反编译了猎豹清理 大师的app看了下,原来是有两张图,于是脑子里就过了 ...