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

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

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

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 "

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");

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

网站地图

Top