微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 开发中虚函数应用,大大减少开发时间

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

时间:09-12 来源:周立功单片机 点击:

37              pAddNode -> 37              pAddNode -> isa.isa.node_calc =_addnode_calc;

38              pAddNode -> isa.isa.node_cleanup = _binnode_cleanup; 

39              pAddNode -> isa._pLeft = pLeft; 

40              pAddNode -> isa._pRight = pRight; 

41        }

42        return pAddNode;

43  } 

44

45  static double _addnode_calc(Node *pThis) 

46  { 

47        printf("Adding...\n"); 

48        AddNode * pAddNode = (AddNode*)pThis;

49        return node_calc(pAddNode -> isa._pLeft) + node_calc(pAddNode -> isa._pRight); 

50  }

51

52  static double _multnode_calc(Node *pThis)

53  {

54        printf("Multiplying...\n"); 

55        MultNode * pMultNode = (MultNode*)pThis; 

56        return node_calc(pMultNode -> isa._pLeft)*node_calc(pMultNode -> isa._pRight); 

57  }

58

59  static void _binnode_cleanup(Node *pThis) 

60  { 

61        printf("BinNode cleanup\n");

62        BinNode * pBinNode = (BinNode*)pThis; 

63        node_cleanup(pBinNode ->_pLeft);

64        node_cleanup(pBinNode ->_pRight);

65        free(pThis);

66  } 

67

68  MultNode * newMultNode(Node *pLeft, Node *pRight)

69  { 

70        MultNode *pMultNode = malloc(sizeof(MultNode));

71        if(pMultNode != NULL){ 

72              pMultNode -> isa.isa.node_calc = _multnode_calc; 

73              pMultNode -> isa.isa.node_cleanup = _binnode_cleanup;

74              pMultNode -> isa._pLeft = pLeft; 

75              pMultNode -> isa._pRight = pRight; 

76        }

77        return pMultNode;

78  } 

79

80  void node_cleanup(Node *pThis)

81  {

82        pThis -> node_cleanup(pThis); 

83  }

>>> 1.1.3 虚函数

虽然可以使用继承实现表达式算术树,但实现代码中的每个对象都有函数指针。如果结构体内有很多函数指针,或必须生成更多的对象时,将会出现多个对象具有相同的行为、需要较多的函数指针和需要生成较多数量的对象,将会浪费很多的内存。

不妨将Node中的成员转移到另一个结构体中实现一个虚函数表,然后在接口中创建一个抽象数据类型NodeVTable,在此基础上定义一个指向该表的指针vtable。比如:

1    // 接口(CalcTree2.h)

2    typedef  struct _NodeVTable  NodeVTable;

3    typedef struct _Node{

4         const NodeVTable * vtable; 

5    }Node;

6    // 实现(CalcTree2.c)

7    typedef

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top