C语言也能面向对象(一)——一个简单的类

Technorati 标签: c, c语言, 面向对象, oo, object-oriented

本文版权所有,转载请注明出处和作者联系方式。
作者:孙华明
联系方式: wormsun at gmail.com

面向对象不是C++, java, C#等的专利,万能的C语言一样可以面向对象编程。GObject系统已经用C语言实现了一套完整并且功能强大的面向对象系统。但GObject系统十分庞大,并依赖于众多的开发包,在项目本身很小,或者不想依赖于众多于GObject相关的开发包时,就无法使用了。
那么能不能用C语言实现一套小巧简单,易于理解,易于使用的面向对象系统呢?就让我们一起探索一下吧!
所谓类就是数据和方法的集合体。我们使用结构体定义类的数据,如下:

   1: struct animal
   2: {
   3:     char name[256];
   4:     int weight;
   5: };

我们定义了一个animal结构体,成员包括animal的name和animal的weight(重量)。
现在数据已经有了,那么方法如何定义呢?
我们知道在面向对象中有封装的概念,所以结构体中的成员我们不应该直接访问,而应该通过方法访问,我们添加访问结构体成员变量的方法:

   1: char* animal_get_name(animal* self);
   2: void animal_set_name(animal* self, char* name);
   3: int animal_get_weight(animal* self);
   4: void animal_set_weight(animal* self, int weight);
   5: char* animal_get_name(animal* self)
   6: {
   7:     return self->name;
   8: }
   9:
  10: void animal_set_name(animal* self, char* name)
  11: {
  12:     strncpy(self->name, name, sizeof(self->name));
  13: }
  14:
  15: int animal_get_weight(animal* self)
  16: {
  17:     return self->weight;
  18: }
  19:
  20: void animal_set_weight(animal* self, int weight)
  21: {
  22:     self->weight = weight;
  23: }
  24:

方法的第一个参数animal* self是对象的地址,与C++中的this指针是同一个概念,只不过C++中的this指针是由编译器帮我们传递的,无需在代码中显式的写出来。
现在类的数据、方法都有了,那么如何使用类创建、初始化、析构、销毁对象呢?
在C++中有new、delete操作符负责创建和销毁,由构造函数和析构函数负责初始化和析构。这些在我们的C语言面向对象系统中都是要实现的,但对于我们的第一个类,我们可以实现的简单一些,如下:

   1: animal* animal_create(void);
   2: void animal_destroy(animal* self);
   3:
   4: animal* animal_create(void)
   5: {
   6:     animal* self = malloc(sizeof(animal));
   7:     LW_ASSERT(self);
   8:     memset(self->name, 0x00, sizeof(self->name));
   9:     self->weight = 0;
  10:     return self;
  11: }
  12:
  13: void animal_destroy(animal* self)
  14: {
  15:     free(self);
  16: }
  17:

animal_create负责对象创建和初始化,animal_destroy负责对象析构和销毁。
到这里我们第一个类的定义就结束了。测试一下吧:

   1: animal* animal1 = NULL;
   2: animal* animal2 = NULL;
   3:
   4: animal1 = animal_create();
   5: animal_set_name(animal1, "Kitty");
   6: animal_set_weight(animal1, 30);
   7: printf("animal1, name : %s, weight : %d/n",
   8: animal_get_name(animal1),
   9: animal_get_weight(animal1));
  10: animal_destroy(animal1);
  11:
  12: animal2 = animal_create();
  13: animal_set_name(animal2, "Bib");
  14: animal_set_weight(animal2, 10);
  15: printf("animal2, name : %s, weight : %d/n",
  16: animal_get_name(animal2),
  17: animal_get_weight(animal2));
  18: animal_destroy(animal2);
  19:

看看测试代码,是不是有些感觉了,其实这里面向对象还远着呢,勉强能称得上是基于对象吧。

相关代码可在此处下载
下一篇我们将介绍如何通过new和delete操作创建和销毁对象,通过构造函数和析构函数初始化和析构对象。

转载于:https://my.oschina.net/u/1052241/blog/209621

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值