zoukankan      html  css  js  c++  java
  • 怎样在C语言里实现“面向对象编程”

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

    在本节中。就展示怎样在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,给出函数接口的实现。

    因为没有办法操纵一台真实的打印机。那样代码太复杂,作者不easy理解。所以这里使用“虚拟打印机”的概念。所谓“打印”,仅仅是将文件写到指定的文件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 "); // 输出文本

          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 ");

          pr_close(pr);

    }

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

    ① 对象的创建:使用pr_open函数来创建一个对象,同意创建多个对象。

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

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

    1.3         第3种方法

    这样的方法是对方法2的升级。理念和方法2一样。

    它是在形式上和C++的class基本一致,也许能够说,C++的class是从这样的方法演化而来的。

    。。

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

     

     

  • 相关阅读:
    二级菜单
    eclipse高版本中EasyExplore的替换插件OpenExplore
    Python学习一
    原型编程的基本规则
    【CF671D】 Roads in Yusland(对偶问题,左偏树)
    【洛谷4542】 [ZJOI2011]营救皮卡丘(最小费用最大流)
    【洛谷4313】 文理分科(最小割)
    【洛谷4001】 [ICPC-Beijing 2006]狼抓兔子(最小割)
    【洛谷2057】 [SHOI2007]善意的投票(最小割)
    【洛谷2053】 [SCOI2007]修车(费用流)
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7235118.html
Copyright © 2011-2022 走看看