开发中虚函数应用,大大减少开发时间
typedef struct _MultNode{
26 BinNode isa;
27 }MultNode;
28
29 NumNode * newNumNode(double num);
30 double node_calc(Node *pThis);
31 AddNode * newAddNode(Node *pLeft, Node *pRight);
32 MultNode * newMultNode(Node *pLeft, Node *pRight);
33 void node_cleanup(Node *pThis);
实现表达式算术树的第一步是输入数据和初始化NumNode结构体的变量isa和_num,newNumNode()函数原型如下:
NumNode * newNumNode(double num);
其调用形式如下:
Node * pNode1 = (Node *)newNumNode(20.0);
Node * pNode2 = (Node *)newNumNode(-10.0);
接下来开始为计算做准备,node_calc()函数原型如下:
double node_calc(Node *pThis);
其调用形式如下:
node_calc(pNode1);
然后开始进行加法运算,newAddNode()函数原型如下:
AddNode * newAddNode(Node *pLeft, Node *pRight);
其调用形式如下:
Node * pNode3 = (Node *)newAddNode(pNode1, pNode2);
当然,也可以开始进行乘法运算了,newMultNode()函数原型如下:
MultNode * newMultNode(Node *pLeft, Node *pRight);
其调用形式如下:
Node * pNode4 = (Node *)newNumNode(0.1);
Node * pNode5 = (Node *)newMultNode(pNode3, pNode4);
一切准备就绪,则计算最终结果并释放不再使用的资源,node_cleanup()函数原型如下:
void node_cleanup(Node *pThis);
其调用形式如下:
printf("Calculating the tree\n");
double x = node_calc(pNode5);
printf("Result:%lf\n", x);
node_cleanup(pNode5);
4. 实现接口
显然,为每个结点创建了相应的类后,就可以为每个结点创建一个动态变量,即可在运行时根据需要使用malloc()分配内存并使用指针存储该地址,并使用指针初始化结构体的各个成员,CalcTree1.c接口的实现详见程序清单 4.16。
程序清单 4.16表达式算术树接口的实现(CalcTree1.c)
1 #include
2 #include
3 #include " CalcTree1.h "
4
5 NumNode * newNumNode(double num)
6 {
7 NumNode *pNumNode = malloc(sizeof(NumNode));
8 if(pNumNode != NULL){
9 pNumNode -> isa.node_calc = _numnode_calc;
10 pNumNode -> isa.node_cleanup = _numnode_cleanup;
11 pNumNode -> _num = num;
12 }
13 return pNumNode;
14 }
15
16 static double _numnode_calc(Node *pThis)
17 {
18 printf("numeric node %lf\n", ((NumNode *) pThis) -> _num);
19 return ((NumNode *)pThis) -> _num;
20 }
21
22 static void _numnode_cleanup(Node *pThis)
23 {
24 printf("NumNode cleanup\n");
25 free(pThis);
26 }
27
28 double node_calc(Node *pThis)
29 {
30 return pThis -> node_calc(pThis);
31 }
32
33 AddNode * newAddNode(Node *pLeft, Node *pRight)
34 {
35 AddNode *pAddNode = malloc(sizeof(AddNode));
36 if(pAddNode != NULL){
37 pAddNode -> 37 pAddNode -> isa.is
- 面向对象编程——虚函数(09-20)
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)