如何在C语言里实现“面向对象编程”

有人认为面向对象是C++/Java这种高级语言的专利,实际不是这样,面向对象作为一种设计方法,是不限制语言的。只能说,用C++/Java这种语法来实现面向对象会更容易、更自然一些。

在本节中,就展示如何在C语言中实现面向对象编程,这是一件吃力的工作。写这些的目的有两个:

① 更好的掌握C++中的class的概念。学习了本章,就知道C程序员的无耐,就知道为什么要发明一个class的概念、为什么要有成员函数等等。

② 为C程序员提供一个参考设计。由在存在某些场合,只允许用C语言来编程,不允许用C++来编程。这时候,可以参考本篇的代码,用C的语法来模拟C++的类来实现面向对象编程。

本篇按从易到难的顺序,提供几种基于C struct的面向对象的写法。在本节的展示中,统一以.c后缀命名文件,也就是说,是以C语言的语法来书写代码。C语言和C++的struct写法略有区别,请参考附录《C++与C的区别》。

权利声明:作者拥有本书的全部权利。作者授权任何人都可以自由转载本网站发布的内容,但转载时必须遵守以下限制: ①转载时必须全文转载,不得有任何修改,必须包含“权利声明”和“官网地址” ② 仅限于网络转载,即最终结果公布于网络上。凡是不遵守以上两条的转载行为视为侵权行为。除非本人允许,任何人不得将本网站内容内容用于任何的其他用途。

官网地址: http://www.afanihao.cn/  留言请到http://www.afanihao.cn/kbase/

1.1         第1种方法

这种方法只适合单一实例的对象。以打印机Print对象为例,系统中只存在一台打印机,此时按以下方法提供接口,

首先,给出printer.h,里面写明对外的接口,

/////////////////// printer.h begin ///////////////

#ifndef _PRINTER_H

#define _PRINTER_H

int pr_open();   // 打开打印机

void pr_close();  // 关闭打印机

void pr_print(const char* text); // 打印文本

#endif

/////////////////////////////////////////////////////

其次,给出printer.c,给出函数接口的实现。由于没有办法操纵一台真实的打印机,那样代码太复杂,作者不容易理解。所以这里使用“虚拟打印机”的概念,所谓“打印”,只是将文件写到指定的文件c:\printer.txt里,

/////////////////// printer.c ///////////////

#include <stdio.h>

#include "printer.h"

// 定义

typedef struct

{

FILE* outfile;

}printer_t;

// 定义唯一实例

static printer_t pr = { NULL };

// 打开打印机

int pr_open()

{

pr.outfile = fopen("c:/printer.txt", "ab");

if(pr.outfile == NULL)

return -1;

return 0;

}

// 关闭打印机

void pr_close()

{

if(pr.outfile)

{

fclose(pr.outfile);

pr.outfile = NULL;

}

}

// 打印文本

void pr_print(const char* text)

{

fprintf(pr.outfile, text);

}

/////////////////// ///////////////

在main.c中这么调用

/////////////////// main.c  ///////////////

#include "printer.h"

void main()

{

pr_open();  // 打开

pr_print("aaabbbccc\n"); // 输出文本

pr_close(); // 关闭

}

可以总结出这种写法的特点:

(1) 虽然是面向对象,但只有一个对象,该对象外部不可见;

(2) 外界只能通过函数接口该对象的功能。可以发现,函数中并没有传入对象的指针。

1.2         第2种方法

当可以创建多个对象时,使用此种方法来实现。仍然前面的printer为例,其实这个printer只是一个“虚拟”的打印机,最终目标是输出到一个本地的文件。那么,可以允许创建多个printer对象的。

头文件printer.h中定义对象,在提供的接口函数都有对象指针,其中~open函数用于创建一个对象,~close用于销毁对象,

///////////////////printer.h  ///////////////

#ifndef _PRINTER_H

#define _PRINTER_H

#include <stdio.h>

typedef struct

{

FILE* outfile;

}printer_t;

printer_t* pr_open(const char* filename);   // 打开打印机

void pr_close(printer_t* pr);  // 关闭打印机

void pr_print(printer_t* pr, const char* text); // 打印文本

#endif

下面是它的实现,

///////////////////printer.c ///////////////

#include <stdio.h>

#include <stdlib.h>

#include "printer.h"

// 打开打印机

printer_t* pr_open(const char* filename)

{

printer_t* pr = (printer_t*)malloc(sizeof(printer_t));

pr->outfile = fopen(filename, "ab");

if(!pr->outfile)

{

free(pr);

return NULL;

}

return pr;

}

// 关闭打印机

void pr_close(printer_t* pr)

{

fclose(pr->outfile);

free(pr);

}

// 打印文本

void pr_print(printer_t* pr, const char* text)

{

fprintf(pr->outfile, text);

}

在main.c的调用这个对象,

///////////////////main.c ///////////////

#include "printer.h"

void main()

{

printer_t* pr = pr_open("c:/1.txt");

pr_print(pr, "aaabbbccc\n");

pr_close(pr);

}

至此,面向对象已经比较完整,它有3个要素:

① 对象的创建:使用pr_open函数来创建一个对象,允许创建多个对象;

② 对象的销毁: 使用pr_close来销毁对象

③ 对象的功能接口: pr_print是其功能接口,注意这个函数的第一个参数就是指向了一个对象

1.3         第3种方法

这种方法是对方法2的升级,理念和方法2一样。它是在形式上和C++的class基本一致,或许可以说,C++的class是从这种方法演化而来的。

。。。本节内容不公开,更多内容请购买纸质教材,谢谢支持!。。。

时间: 2024-10-09 03:12:44

如何在C语言里实现“面向对象编程”的相关文章

Go语言学习(十一)面向对象编程-类型系统

1.类型系统介绍 对于面向对象编程的支持Go 语言设计得非常简洁而优雅.简洁之处在于,Go语言并没有沿 袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的 this 指 针等. 一个典型的类型系统通常包含如下基本内容: 基础类型,如 byte . int . bool . float 等: 复合类型,如数组.结构体.指针等: 可以指向任意对象的类型( Any 类型): 面向对象,即所有具备面向对象特征(比如成员方法)的类型: 接口. 因为Java语言自诞生以来被称为最纯

Go语言学习(十三)面向对象编程-继承

1.匿名组合 Go语言也提供了继承,但是采用了组合的方式,所以我们将其称为匿名组合: package main import "fmt" //定义基类 type Base struct { Name string } //基类相关的2个成员方法 func (base *Base) A() { fmt.Println("Base method A called...") } func (base *Base) B() { fmt.Println("Base

Python之路【第五篇】:面向对象编程

面向对象编程思维导向图 http://naotu.baidu.com/file/03516c91377d6cad0ded041aa4ce4433?token=ccaba09527261666 密码: Tim 面向:过程.函数.对象 面向过程:根据业务逻辑从上到下写垒代码! 面向过程的编程弊:每次调用的时候都的重写,代码特别长,代码重用性没有,每次增加新功能所有的代码都的修改!那有什么办法解决上面出现的弊端呢?函数就出现了. 面向函数:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可!

python中的面向对象编程

在python中几乎可以完成C++里所有面向对象编程的元素. 继承:python支持多继承: class Derived(base1, base2, base3): pass 多态:python中的所有实例方法都是virtual类型的 封装: 这个比较特殊,C++编程中一直强调得比较多的是:为了隐藏实现,所有的成员变量都要是private类型的,还有那些仅与实现相关的,不作为外部接口的方法都要定义成private类型的(或者protected).但是在python里面,并不存在真正的私有类型,根

Python基础6-1 面向对象编程

概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处. while True:     if cpu利用率 > 90%:         #发送邮件提醒         连接邮箱服务器         发送邮件     

快速理解JavaScript面向对象编程—原型继承

总的来说js语言就是门面向对象编程的语言,对象这个概念几乎贯穿了整个js的学习. 对象 创建对象两种方法:(若要生成对象实例必须调用构造函数) 1.var obj = {name:"jer" , age:12};(在js内部调用了预设的Object()构造函数) 访问:alert(obj.name);//"jer" alert(obj["name"]);//"jer" 2.var obj = new Object(); obj

C语言/C+游戏编程学习之简单 DLL 劫持,就是这么任性

C语言面向过程编程的语言:C++面向对象编程的语言. 两者有本质的区别,其实是完全不同的两种语言,只不过C++兼容C语言而已. 其中C++则一般看作是对C语言的扩展.因为C语言没有面向对象的语法结构,而当时业界又迫切需要面向对象的编程特性,所以贝尔实验室的开发者就为C语言添加了面向对象的结构.现在C++已经不只是C语言的扩展了,它已经完全可以被看作一种新的编程语言.虽然C语言的特性以及库函数仍然被C++支持,不过C++拥有自己的独立的类库体系,功能相当强大. C/C++的优点在于与底层比较接近,

go语言学习(五)——面向对象编程

主要讲的是"类"和接口&和其他传统语言不一样的地方挺多的,断断续续看了好几天 下面是我的练习代码 // GoStudy0219 project main.go /* go语言学习--面向对象编程(1) go中类型的值语义和引用语义 结构体(类)的定义和初始化 */ package main import ( "fmt" ) func main() { //几种"类"的初始化 v1 := &character{"Tom&q

R语言基于S4的面向对象编程

前言 本文接上一篇文章 R语言基于S3的面向对象编程,本文继续介绍R语言基于S4的面向对象编程. S4对象系统具有明显的结构化特征,更适合面向对象的程序设计.Bioconductor社区,以S4对象系统做为基础架构,只接受符合S4定义的R包. 目录 S4对象介绍 创建S4对象 访问对象的属性 S4的泛型函数 查看S4对象的函数 S4对象的使用 1 S4对象介绍 S4对象系统是一种标准的R语言面向对象实现方式,S4对象有明确的类定义,参数定义,参数检查,继承关系,实例化等的面向对象系统的特征. 2