本文版权所有,转载请注明出处和作者联系方式。
作者:孙华明
联系方式: 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操作创建和销毁对象,通过构造函数和析构函数初始化和析构对象。