C语言的面向对象程序设计
- 1. 面向对象的要素
- 2. C语言如何实现类的功能
- 1. C语言实现类的定义
- 2. C语言实现类的实例化
面向对象的设计通常是C++/Java等有“类”的语言才做的事情,但事实上并不是这样的。面向对象的程序是一种程序设计思路,即使你使用C++、Java等语言,如果你还是面向过程的思维,那么设计出来的程序还是面向过程的程序而不是面向对象的程序。
只是因为C++、Java有了类,它天然就适合面向对象设计。C语言要面向对象设计需要做一些变通,这些变通其实比较简单,难的是你的思路是不是面向对象。
本篇只是做一个简单的表述,希望能起到一个抛转引玉的作用。如有表述不正确的地方,希望指正。
1. 面向对象的要素
面向对象通常需要把要实现的功能划分为几个模块(类),理想的情况下每个模块要足够小:只完成它应该完成的工作,足够独立:不与其他模块相耦合。怎么划分为几个类不是本篇的重点,本篇的重点是如何使用C语言来实现类的功能。
实现类要哪些要素呢?一是类的定义,二是类的实例化。
2. C语言如何实现类的功能
1. C语言实现类的定义
类的组成要素是:成员变量与成员函数。
对于C语言,类比于类的就是结构体,但结构体全是由变量构成的。要实现类的成员变量很简单,结构体本身就支持,主要的问题是要怎么实现成员函数。
思路一:假设用一个.c文件来表示一个模块,那么在这个模块中定义多个函数,把这些函数当成成员函数。这种情况有点类似于类里面的static函数。
思路二:在结构体上定义几个函数指针,然后在初始化函数中给这此函数指针赋值。
例子:
typedef void (*func_set_value)(uint8_t value);
typedef uint8 (*func_get_value)(void);
typedef struct
{
uint8_t value;
func_set_value p_set_func;
func_get_value p_get_func;
} class_type_t;
static class_type_t s_example_class;
void setValue(uint8_t value)
{
s_example_class.value = value;
}
uint8_t getValue(void)
{
return s_example_class.value;
}
void ClassInit(void)
{
s_example_class.p_set_func = setValue;
s_example_class.p_get_func = getValue;
}
2. C语言实现类的实例化
实例化类就是要给类分配空间,并给一些成员变量赋初值。对于C语言来说就是定义一个结构体变量,然后给结构体的成员赋值,这里的成员可以是普通变量,也可以是函数指针,也可以是结构体。