在C语言中引入类的概念

发表于:2007-05-25来源:作者:点击数: 标签:言中引入程序设计对象概念
基于对象的程序设计的好处大家应该都有一定的体会,但是在C语言中并不支持类的概念,不过我们可以通过struct实现一些基础的类对象,如队列、堆栈等。通过对象的实现可以在一定程度上提高编程效率、简化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:48clearcase/" target="_blank" >cc4ec090="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
楼主:
    你这个方法看上去更向代码复用,类的概念包括代码复用,但更重要的是描述对象的数据结构也要复用。也就是对象对于调用他的代码来说是个黑匣子。不知我理解的对吗?

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)