文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

用C语言怎么写面向的对象

2023-06-17 04:42

关注

这篇文章主要讲解了“用C语言怎么写面向的对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用C语言怎么写面向的对象”吧!

以下我将用一个工厂类实现具体汽车的生产,奔驰车、宝马车、奥迪车都将通过工厂类来生产,由父类指针指向具体的汽车实例:

头文件:

//Car.h  #ifndef CAR_H_  #define CAR_H_  typedef enum CarType_E  {      CAR_TYPE_BENZE = 0,      CAR_TYPE_BMW      ,      CAR_TYPE_AUDI     ,      CAR_TYPE_NONE     ,  }CarType_E;  class BaseCar  {  public:      BaseCar(CarType_E CarType);  virtual ~BaseCar();  virtual void CarSpeaker();      CarType_E _CarType;  };  class BenzeCar : public BaseCar  {  public:      BenzeCar(CarType_E CarType);      ~BenzeCar();  public:  void CarSpeaker();  };  class BMWCar : public BaseCar  {  public:      BMWCar(CarType_E CarType);      ~BMWCar();  void CarSpeaker();  };  class AudiCar : public BaseCar  {  public:      AudiCar(CarType_E CarType);      ~AudiCar();  void CarSpeaker();  };  class CarFactory  {  public:  BaseCar* createNewCar(CarType_E CarType);  };  #endif 

源代码:

//Car.cpp  #include "Car.h"  #include <iostream>  using namespace std;  BaseCar::BaseCar(CarType_E CarType) : _CarType(CarType)  {  printf("BaseCar create\n");  }  BaseCar::~BaseCar()  {  printf("BaseCar delete\n");  }  void BaseCar::CarSpeaker()  {  std::cout << "BeBu! BeBu" << endl;  }  BenzeCar::BenzeCar(CarType_E CarType) : BaseCar(CarType)  {  printf("BenzeCar create\n");  }  BenzeCar::~BenzeCar()  {  printf("BenzeCar delete\n");  }  void BenzeCar::CarSpeaker()  {  printf("BeBu! BeBu! BenzeCar Car,Type:%d\n", _CarType);  }  BMWCar::BMWCar(CarType_E CarType) : BaseCar(CarType)  {  printf("BMWCar create\n");  }  BMWCar::~BMWCar()  {  printf("BMWCar delete\n");  }  void BMWCar::CarSpeaker()  {  printf("BeBu! BeBu! BMWCar Car,Type:%d\n", _CarType);  }  AudiCar::AudiCar(CarType_E CarType) : BaseCar(CarType)  {  printf("AudiCar create\n");  }  AudiCar::~AudiCar()  {  printf("AudiCar delete\n");  }  void AudiCar::CarSpeaker()  {  printf("BeBu! BeBu! AudiCar Car,Type:%d\n", _CarType);  }  BaseCar* CarFactory::createNewCar(CarType_E CarType)  {      BaseCar* newCar = NULL;  switch(CarType)      {  case CAR_TYPE_BENZE:          {              newCar = new BenzeCar(CAR_TYPE_BENZE);  break;          }  case CAR_TYPE_BMW:          {              newCar = new BMWCar(CAR_TYPE_BMW);  break;          }  case CAR_TYPE_AUDI:          {              newCar = new AudiCar(CAR_TYPE_AUDI);  break;          }  default:          {              newCar = new BaseCar(CAR_TYPE_NONE);  break;          }      }  return newCar;  }

测试代码main.cpp

//main.cpp  #include <iostream>  #include "Car.h"  using namespace std;  int main() {      CarFactory* carFactory = new CarFactory();      BaseCar* newBenzeCar = carFactory->createNewCar(CAR_TYPE_BENZE);      BaseCar* newBMWCar = carFactory->createNewCar(CAR_TYPE_BMW);      BaseCar* newAudiCar = carFactory->createNewCar(CAR_TYPE_AUDI);      newBenzeCar->CarSpeaker();      newBMWCar->CarSpeaker();      newAudiCar->CarSpeaker();  delete newBenzeCar;      newBenzeCar = NULL;  delete newBMWCar;      newBMWCar = NULL;  delete newAudiCar;      newAudiCar = NULL;  delete carFactory;      carFactory = NULL;  return 0;  }

编译后输出:

用C语言怎么写面向的对象

以上便是简单工厂模式的源码示例,现在,我们来聊聊为什么用C语言我们也可以实现这面向对象思维的三大特性:

首先是封装性:C++的封装性就是将抽象类的函数和属性都封装起来,不对外开放,外部要使用这些属性和方法都必须通过一个具体实例对象去访问这些方法和属性,而我们知道,C语言中一旦包含了头文件便可以使用头文件中的函数和变量,其实C语言中也可以用一种方法达到这种效果,那便是使用结构体+函数指针+static,结构体中定义属性和函数指针,static将方法都限制在本模块使用,对外部,通过指针函数的方式访问,如此一来,便可以达到面向对象封装性的实现;

对于继承性:C++ 面向对象的继承是可以继承父类的属性和方法,在子类对象中的内存中是有父类对象的内存的,那么,用C语言来写的话我们完全可以在父类结构体中定义一个父类变量在其中,在使用构造子类的时候同时构造父类,便可以达到继承性的特性;

对于多态性:C++中允许一个父类指针指向子类实体,在这个指针使用方法时,若此方法是虚函数,则执行动作会执行到具体的子类函数中,本质的实现方式是通过一个虚函数指针的方式,由于我们用C语言写面向对象本就是通过函数指针的方式来封装函数,那我们完全可以将结构体父类的变量的函数指针让他指向子类的函数来达到多态的特性。

好了,在你们面前班门弄斧了一番,下面开始具体的代码实现:

头文件:

#ifndef CAR_H_  #define CAR_H_  #include <stdio.h>  #include <stdlib.h>  typedef enum CarType  {      CAR_BENZE = 0,      CAR_BMW,      CAR_AUDI,      CAR_NONE,  }CarType;  typedef struct Base_Car  {      CarType car_type;  void (* speaker)(struct Base_Car* car);  void* parent_car; //point to parent,if no any parent,then make it NULL  }Base_Car;  typedef struct Benze_Car  {      Base_Car* car;  void (* speaker)(struct Base_Car* car);  }Benze_Car;  typedef struct BMW_Car  {      Base_Car* car;  void (* speaker)(struct Base_Car* car);  }BMW_Car;  typedef struct Audi_Car  {      Base_Car* car;  void (* speaker)(struct Base_Car* car);  }Audi_Car;  typedef struct Car_Factory  {      Base_Car* (* create_new_car)(CarType car_type);  }Car_Factory;  Car_Factory* new_car_factory();  void delete_car_factory(Car_Factory* car_factory);  Base_Car* new_Base_Car();  Benze_Car* new_benze_Car();  BMW_Car* new_bmw_Car();  Audi_Car* new_audi_Car();  void delete_Base_Car(struct Base_Car* car);  void delete_Benze_Car(struct Benze_Car* car);  void delete_BMW_Car(struct BMW_Car* car);  void delete_Audi_Car(struct Audi_Car* car);  #endif 

源文件:

#include "Car.h"  static void Car_speaker(struct Base_Car* car)   {  printf("this is a car\n");  }  static void Benze_speaker(struct Base_Car* car)   {  printf("this is Benze Car, car type is :%d\n",car->car_type);  }  static void BMW_speaker(struct Base_Car* car)   {  printf("this is BMW Car, car type is :%d\n",car->car_type);  }  static void Audi_speaker(struct Base_Car* car)   {  printf("this is Audi Car, car type is :%d\n",car->car_type);  }  Benze_Car* new_benze_Car()   {      Benze_Car* real_car = (Benze_Car*)malloc(sizeof(Benze_Car));      Base_Car* base_car = new_Base_Car();  printf("Benze_Car create\n");      real_car->car = base_car;      real_car->speaker = Benze_speaker;      base_car->car_type = CAR_BENZE;      base_car->parent_car = (void*)real_car;      base_car->speaker = real_car->speaker;  return real_car;  }  BMW_Car* new_bmw_Car()   {      BMW_Car* real_car = (BMW_Car*)malloc(sizeof(BMW_Car));      Base_Car* base_car = new_Base_Car();  printf("BMW_Car create\n");      base_car->car_type = CAR_BMW;      real_car->car = base_car;      real_car->speaker = BMW_speaker;      base_car->car_type = CAR_BMW;      base_car->parent_car = (void*)real_car;      base_car->speaker = real_car->speaker;  return real_car;  }  Audi_Car* new_audi_Car()   {      Audi_Car* real_car = (Audi_Car*)malloc(sizeof(Audi_Car));      Base_Car* base_car = new_Base_Car();  printf("Audi_Car create\n");      base_car->car_type = CAR_AUDI;      real_car->car = base_car;      real_car->speaker = Audi_speaker;      base_car->car_type = CAR_AUDI;      base_car->parent_car = (void*)real_car;      base_car->speaker = real_car->speaker;  return real_car;  }  Base_Car* new_Base_Car()   {      Base_Car* base_car = (Base_Car*)malloc(sizeof(Base_Car));  printf("BaseCar create\n");      base_car->car_type = CAR_NONE;      base_car->parent_car = NULL;      base_car->speaker = Car_speaker;  return base_car;  }  Base_Car* create_new_Car(CarType car_type)   {      Base_Car* base_car = NULL;  switch(car_type)      {  case CAR_BENZE:          {              Benze_Car* real_car = new_benze_Car();              base_car = real_car->car;  break;          }  case CAR_BMW:          {              BMW_Car* real_car = new_bmw_Car();              base_car = real_car->car;  break;          }  case CAR_AUDI:          {              Audi_Car* real_car = new_audi_Car();              base_car = real_car->car;  break;          }  default:  break;      }  return base_car;  }  void delete_Benze_Car(struct Benze_Car* car)   {  free(car->car);      car->car = NULL;  free(car);  printf("Benze_Car delete\n");  }  void delete_BMW_Car(struct BMW_Car* car)   {  free(car->car);      car->car = NULL;  free(car);  printf("BMW_Car delete\n");  }  void delete_Audi_Car(struct Audi_Car* car)   {  free(car->car);      car->car = NULL;  free(car);  printf("Audi_Car delete\n");  }  void delete_Base_Car(struct Base_Car* car)   {  if(NULL != car->parent_car)      {  switch(car->car_type)          {  case CAR_BENZE:              {                  delete_Benze_Car((Benze_Car*)car->parent_car);                  car = NULL; //base car will be delete in child free function  break;              }  case CAR_BMW:              {                  delete_BMW_Car((BMW_Car*)car->parent_car);                  car = NULL;  break;              }  case CAR_AUDI:              {                  delete_Audi_Car((Audi_Car*)car->parent_car);                  car = NULL;  break;              }  default:  break;          }      }  if(NULL != car)      {  free(car);          car = NULL;      }  printf("Base_Car delete\n");  }  Car_Factory* new_car_factory()   {      Car_Factory* car_factory = (Car_Factory*)malloc(sizeof(Car_Factory));      car_factory->create_new_car = create_new_Car;  return car_factory;  }  void delete_car_factory(Car_Factory* car_factory)   {  free(car_factory);      car_factory = NULL;  }

测试文件main.cpp

#include <stdio.h>  #include "Car.h"  int main()  {      Car_Factory* car_factory = new_car_factory();      Base_Car* benzeCar = car_factory->create_new_car(CAR_BENZE);      Base_Car* bmwCar = car_factory->create_new_car(CAR_BMW);      Base_Car* audiCar = car_factory->create_new_car(CAR_AUDI);      benzeCar->speaker(benzeCar);      bmwCar->speaker(bmwCar);      audiCar->speaker(audiCar);      delete_Base_Car(benzeCar);      benzeCar = NULL;      delete_Base_Car(bmwCar);      bmwCar = NULL;      delete_Base_Car(audiCar);      audiCar = NULL;      delete_car_factory(car_factory);      car_factory = NULL;  return 0;  }

编译后执行:

用C语言怎么写面向的对象

感谢各位的阅读,以上就是“用C语言怎么写面向的对象”的内容了,经过本文的学习后,相信大家对用C语言怎么写面向的对象这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯