感觉c语言也可以面向对象,C语言也能面向对象(一)——一个简单的类

本文版权所有,转载请注明出处和作者联系方式。

作者:孙华明

联系方式: 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操作创建和销毁对象,通过构造函数和析构函数初始化和析构对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值