开发中虚函数应用,大大减少开发时间
double (*node_calc_t)(Node *pThis);
8 typedef void (*node_cleanup_t)(Node *pThis);
9 struct _NodeVTable{
10 const node_calc_t node_calc;
11 const node_cleanup_t node_cleanup;
12 };
13 const NodeVTable _addnode_vtable = { _addnode_calc, _binnode_cleanup};
表达式算术树的接口详见程序清单 4.17,其中的NumNode派生于Node,_num表示数值;BinNode也是派生于Node,pLeft和pRight分别表示指向左子树和右子树的指针;而AddNode和MultNode又派生于BinNode。虽然抽象类包含一个或多个纯虚函数类,但不能实例化(此类没有对象可创建),只有从一个抽象类派生的类和为所有纯虚函数提供了实现代码的类才能实例化,它们都必须提供自己的计算方法node_calc和node_cleanup。
程序清单 4.17 表达式算术树接口(CalcTree2.h)
1 #pragma once
2
3 typedef struct _NodeVTable NodeVTable;
4 typedef struct _Node{
5 const NodeVTable * vtable;
6 }Node;
7
8 typedef struct _NumNode{
9 Node isa;
10 double _num;
11 }NumNode;
12
13 typedef struct _AddNode{
14 Node isa;
15 Node *_pLeft;
16 Node *_pRight;
17 }AddNode;
18
19 typedef struct _MultNode{
20 Node isa;
21 Node *_pLeft;
22 Node *_pRight;
23 }MultNode;
24
25 double node_calc(Node *pThis);
26 void node_cleanup(Node *pThis);
27
28 NumNode * newNumNode(double num);
29 AddNode * newAddNode(Node *pLeft, Node *pRight);
30 MultNode * newMultNode(Node *pLeft, Node *pRight);
显然,为每个结点创建了相应的类后,就可以为每个结点创建一个动态变量,即可在运行时根据需要使用malloc()分配内存并使用指针存储该地址,并使用指针初始化结构体的各个成员,表达式算术树接口的实现详见程序清单 4.18。
程序清单 4.18 表达式算术树接口的实现(CalcTree2.c)
1 #include
2 #include
3 #include " CalcTree2.h "
4
5 typedef double (*node_calc_t)(Node *pThis);
6 typedef void (*node_cleanup_t)(Node *pThis);
7 struct _NodeVTable{
8 const node_calc_t node_calc;
9 const node_cleanup_t node_cleanup;
10 };
11
12 static double _numnode_calc(Node *pThis)
13 {
14 printf("numeric node %lf\n", ((NumNode *)pThis)->_num);
15 return ((NumNode *)pThis) ->_num;
16 }
17
18 static void _numnode_cleanup(Node *pThis)
19 {
20 printf("NumNode cleanup\n");
21 free(pThis);
22 }
23
24 const NodeVTable _numnode_vtable = {_numnode_calc, _numnode_cleanup};
25
26 static void _binnode_cleanup(Node *pThis)
27 {
28 printf("BinNode cleanup\n");
- 面向对象编程——虚函数(09-20)
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)