开发中虚函数应用,大大减少开发时间.doc

上传人:白大夫 文档编号:3436006 上传时间:2019-08-25 格式:DOC 页数:5 大小:31KB
返回 下载 相关 举报
开发中虚函数应用,大大减少开发时间.doc_第1页
第1页 / 共5页
亲,该文档总共5页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《开发中虚函数应用,大大减少开发时间.doc》由会员分享,可在线阅读,更多相关《开发中虚函数应用,大大减少开发时间.doc(5页珍藏版)》请在三一文库上搜索。

1、开发中虚函数应用,大大减少开发时间近日周立功教授公开了数年的心血之作程序设计与数据结构,电子版已无偿性分享到电子工程师与高校群体下载,经周立功教授授权,特对本书内容进行连载。1.1虚函数1.1.1 二叉树1.1.2 表达式算术树1. 问题2. 抽象类3.建立接口4. 实现接口1.1.3 虚函数虽然可以使用继承实现表达式算术树,但实现代码中的每个对象都有函数指针。如果结构体内有很多函数指针,或必须生成更多的对象时,将会出现多个对象具有相同的行为、需要较多的函数指针和需要生成较多数量的对象,将会浪费很多的内存。不妨将Node中的成员转移到另一个结构体中实现一个虚函数表,然后在接口中创建一个抽象数据

2、类型NodeVTable,在此基础上定义一个指向该表的指针vtable。比如:1 /接口(CalcTree2.h)2 typedef struct _NodeVTable NodeVTable;3 typedef struct _Node4 const NodeVTable * vtable;5 Node;6 /实现(CalcTree2.c)7 typedef double (*node_calc_t)(Node *pThis);8 typedef void (*node_cleanup_t)(Node *pThis);9 struct _NodeVTable10 const node_cal

3、c_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。虽然抽象类包含一个或多个纯虚函数类,但不能实例化(此类没有对象可创建),只有从一个抽象类派生的类和为所有

4、纯虚函数提供了实现代码的类才能实例化,它们都必须提供自己的计算方法node_calc和node_cleanup。程序清单4.17表达式算术树接口(CalcTree2.h)1 #pragma once23 typedef struct _NodeVTable NodeVTable;4 typedef struct _Node5 const NodeVTable * vtable;6 Node;78 typedef struct _NumNode9 Node isa;10 double _num;11 NumNode;1213 typedef struct _AddNode14 Node isa;

5、15 Node *_pLeft;16 Node *_pRight;17 AddNode;1819 typedef struct _MultNode20 Node isa;21 Node *_pLeft;22 Node *_pRight;23 MultNode;2425 double node_calc(Node *pThis);26 void node_cleanup(Node *pThis);2728 NumNode * newNumNode(double num);29 AddNode * newAddNode(Node *pLeft, Node *pRight);30 MultNode

6、* newMultNode(Node *pLeft, Node *pRight);显然,为每个结点创建了相应的类后,就可以为每个结点创建一个动态变量,即可在运行时根据需要使用malloc()分配内存并使用指针存储该地址,并使用指针初始化结构体的各个成员,表达式算术树接口的实现详见程序清单 4.18。程序清单4.18表达式算术树接口的实现(CalcTree2.c)1 #include 2 #include 3 #include CalcTree2.h 45 typedef double (*node_calc_t)(Node *pThis);6 typedef void (*node_clean

7、up_t)(Node *pThis);7 struct _NodeVTable8 const node_calc_t node_calc;9 const node_cleanup_t node_cleanup;10 ;1112 static double _numnode_calc(Node *pThis)13 14 printf(numeric node %lfn, (NumNode *)pThis)-_num);15 return (NumNode *)pThis) -_num;16 1718 static void _numnode_cleanup(Node *pThis)19 20 p

8、rintf(NumNode cleanupn);21 free(pThis);22 2324 const NodeVTable _numnode_vtable = _numnode_calc, _numnode_cleanup;2526 static void _binnode_cleanup(Node *pThis)27 28 printf(BinNode cleanupn);29 BinNode * pBinNode = (BinNode*)pThis;30 node_cleanup(pBinNode -_pLeft);31 node_cleanup(pBinNode -_pRight);

9、32 free(pThis);33 3435 static double _addnode_calc(Node *pThis)36 37 printf(Adding.n);38 AddNode * pAddNode = (AddNode*)pThis;39 return node_calc(pAddNode - isa._pLeft) + node_calc(pAddNode - isa._pRight);40 4142 const NodeVTable _addnode_vtable = _addnode_calc, _binnode_cleanup ;4344 static double

10、_multnode_calc(Node *pThis)45 46 printf(Multiplying.n);47 MultNode * pMultNode = (MultNode*)pThis;48 return node_calc(pMultNode - isa._pLeft)*node_calc(pMultNode - isa._pRight);49 5051 const NodeVTable _multnode_vtable = _multnode_calc, _binnode_cleanup ;5253 NumNode * newNumNode(double num)54 55 Nu

11、mNode *pNumNode = malloc(sizeof(NumNode);56 if(pNumNode != NULL)57 pNumNode - isa.vtable = 58 pNumNode - _num = num;59 60 return pNumNode;60 return pNumNode;61 6263 AddNode * newAddNode(Node *pLeft, Node *pRight)64 65 AddNode *pAddNode = malloc(sizeof(AddNode);66 if(pAddNode != NULL)67 pAddNode - is

12、a.isa.vtable = 68 pAddNode - isa._pLeft = pLeft;69 pAddNode - isa._pRight = pRight;70 71 return pAddNode;72 7374 MultNode * newMultNode(Node *pLeft, Node *pRight)75 76 MultNode *pMultNode = malloc(sizeof(MultNode);77 if(pMultNode != NULL)78 pMultNode - isa.isa.vtable = 79 pMultNode - isa._pLeft = pLeft;80 pMultNode - isa._pRight = pRight;81 82 return pMultNode;83 8485 double node_calc(Node *pThis)86 87 return pThis - vtable - node_calc(pThis);88 8990 void node_cleanup(Node *pThis)92 pThis - vtable - node_cleanup(pThis);93

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1