中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
在C语言中引入类的概念
作者:未知 时间:2005-09-13 19:25 出处:ChinaUnix.net 责编:chinaitpower
              摘要:在C语言中引入类的概念

基于对象的程序设计的好处大家应该都有一定的体会,但是在 C 语言中并不支持类的概念,不过我们可以通过 struct 实现一些基础的类对象,如队列、堆栈等。通过对象的实现可以在一定程度上提高编程效率、简化 C程序设计。下面使用一个例子来介绍下如何在实现一个简单的类,希望对大家有些益处:

/* 应用消息队列类 */
struct AppQueue{
struct AppFrame *pHead, *pTail;

void (*InQueue)(struct AppQueue *papq, struct AppFrame *apf);
struct AppFrame * (*OutQueue)(struct AppQueue *papq);
unsigned char (*Empty)(struct AppQueue *papq);
void (*ClearQueue)(struct AppQueue *papq);
};

/* AppQueue 类成员函数实体 */
void apq_InQueue(struct AppQueue *papq, struct AppFrame *apf)
{
if(apf == NULL) return;

apf->pNext = NULL;

if(papq->pTail != NULL){
papq->pTail->pNext = apf;
papq->pTail = apf;
}
else{
papq->pHead = papq->pTail = apf;
}

}

struct AppFrame * apq_OutQueue(struct AppQueue *papq)
{
struct AppFrame *paf;

paf = papq->pHead;

if(papq->pHead != papq->pTail){
papq->pHead = papq->pNext;
}
else{
papq->pHead = papq->pTail = NULL;
}

return paf;
}

unsigned char apq_Empty(struct AppQueue *papq)
{
if((papq->pHead == papq->pTail) && (papq->pTail == NULL))
return TRUE;
else
return FALSE;
}

void apq_ClearQueue(struct AppQueue *papq)
{
struct AppFrame *paf;
while((paf = papq->OutQueue(papq)) != NULL){
SysAppPool.Free(&SysAppPool, paf);
}
}

/* AppQueue 类对象初始化 */
void InitAppQueue(struct AppQueue *papq)
{
papq->pHead = papq->pTail = NULL;

papq->InQueue = apq_InQueue;
papq->OutQueue = apq_OutQueue;
papq->Empty = apq_Empty;
papq->ClearQueue = apq_ClearQueue;
}

Qiyaismine@163.com

 xuejm 回复于:2003-10-13 09:39:13
不错,不错!!!

 flw 回复于:2003-10-13 09:45:52
顺便说一句,如果将 apq* 这些函数申明成 static 的,则效果会更好。

 flyingbear 回复于:2003-10-13 09:50:40
我以前试过的。可惜这样实现不了类成员的访问控制,不过这个倒不是很重要。

 Qiya 回复于:2003-10-13 14:37:32
[quote:48cc4ec090="flw"]顺便说一句,如果将 apq* 这些函数申明成 static 的,则效果会更好。[/quote:48cc4ec090]

能具体说一下吗?

 flw 回复于:2003-10-13 14:46:38
[quote:ddc7ab00ae="Qiya"]

能具体说一下吗?[/quote:ddc7ab00ae]
[code:1:ddc7ab00ae]void InitAppQueue(struct AppQueue *papq) 

papq->pHead = papq->pTail = NULL; 

papq->InQueue = apq_InQueue; 
papq->OutQueue = apq_OutQueue; 
papq->Empty = apq_Empty; 
papq->ClearQueue = apq_ClearQueue; 

[/code:1:ddc7ab00ae]
改成
[code:1:ddc7ab00ae] static void InitAppQueue(struct AppQueue *papq) 

papq->pHead = papq->pTail = NULL; 

papq->InQueue = apq_InQueue; 
papq->OutQueue = apq_OutQueue; 
papq->Empty = apq_Empty; 
papq->ClearQueue = apq_ClearQueue; 

[/code:1:ddc7ab00ae]
诸如此类

 Qiya 回复于:2003-10-13 15:03:15
[quote:ba360a27ae="flw"]诸如此类[/quote:ba360a27ae]
是了!谢谢!只要将成员函数加上 static 可以限制其作用域,使其只能在本文件内可见!

 bigluo 回复于:2003-10-13 15:18:48
好像也没有这个必要,如果对形式要求的那么严格,就用c++呀。berkly DB 1.x的api就是这个样子的,搞得很别扭。

 star55 回复于:2003-10-13 15:22:58
C++编程思想里面介绍得挺详细的,觉得如果真的想用C实现CLASS的一部分功能,应该去看那本书

 Qiya 回复于:2003-10-13 15:52:24
[quote:8e542e89cd="star55"]C++编程思想里面介绍得挺详细的,觉得如果真的想用C实现CLASS的一部分功能,应该去看那本书[/quote:8e542e89cd]

我就是从<<C++编程思想>>中借鉴过来的!特别是讲 this 指针的那部分

 Qiya 回复于:2003-10-13 15:56:56
[quote:3636242092="bigluo"]好像也没有这个必要,如果对形式要求的那么严格,就用c++呀。berkly DB 1.x的api就是这个样子的,搞得很别扭。[/quote:3636242092]

我们已有的程序是用 c 写的,现在不想一下子全用c++ 重写!其实这样做还是有一些好处的!

 flw 回复于:2003-10-13 19:55:16
[quote:4533ef74e6="Qiya"]我们已有的程序是用 c 写的,现在不想一下子全用c++ 重写!其实这样做还是有一些好处的![/quote:4533ef74e6]
顺便说一句,其实在 C++ 中还是可以使用以前的 C 程序的。

 grip2 回复于:2003-10-14 13:33:16
实现的太简单了,够不成一个“类”的概念。

实际GCC本身就包含一种思想,就是在C的基础上引进面向对象的思想,这不是通过一个简单的类来实现的。

无论从kernel还是一些著名的应用程序代码都可以看见以GCC来构建的面向对象的思想。

当然,也不反对用C来实现类,但是这不是很简单,尤其你如果想把已经有的C++代码搬到C上,那这是很艰难的,要考虑太多的内容。如果真想去如此做的话,那看THIS部分是不够的,建议看看COM的实现,可以从另一个角度充分了解C++ 运行期环境。

在C++中可以用C,但是就象C++之父说的:“C++和C是两种语言”。所以不要被他们在语法上的类似就混淆使用,那样有可能会导致一些不可预料的事情发生。

 流浪的狗 回复于:2003-10-14 15:33:56
楼主:
    你这个方法看上去更向代码复用,类的概念包括代码复用,但更重要的是描述对象的数据结构也要复用。也就是对象对于调用他的代码来说是个黑匣子。不知我理解的对吗?

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有