c++ 成员函数作为函数指针参数传入

c++ 成员函数作为函数指针参数传入

标签: c++treestruct图形c
4239人阅读 评论(0) 收藏 举报
分类:

       在编写二叉树图形化演示程序的时候,要实现二叉树的前序,中序、后序遍历,遍历的时候传入一个函数指针来处理遍历到的节点

 

  1. void XXXX::InOrder(TreeNode * Tree,int (*func)(TreeNode * Tree))  
  2. {  
  3.     if( ! Tree ) return ;  
  4.       
  5.     InOrder(Tree->lchild,func);    
  6.     if ( !func(Tree) ) return;  
  7.           InOrder(Tree->rchild,func);}  
  8. }   


 

另外有一个成员函数:目的是作为函数指针(节点处理函数)

 

  1. int XXXX::VisitList(TreeNode *Tree)  
  2. {  
  3.     //Do Sth  
  4.     return 1;  
  5. }  


但是在c++里面,将成员函数作为函数指针传入的时候会提示类型不匹配调用的时候 PreOrder(m_pTree,VisitList);会有下面的错误提示:

  1. error C2664: 'PreOrder' : cannot convert parameter 2 from 'int (struct tagTreeNode *)' to 'int (__cdecl *)(struct tagTreeNode *)'  
  2.        None of the functions with this name in scope match the target type  


 

这个是因为成员函数和函数指针处理的编译模式 不一样 
一个是thiscall,一个是__cdecl 

 

解决方案:

修改有参数为成员函数指针的函数如下:

 

  1. void XXXX::PreOrder(TreeNode * Tree,int (CMyTreeDlg::*func)(TreeNode * Tree))  
  2. {  
  3.     if( ! Tree ) return ;  
  4.       
  5.     if ( !( this->*func)(Tree) )  
  6.         return;  
  7.     PreOrder(Tree->lchild,func);  
  8.     PreOrder(Tree->rchild,func);  
  9. }  


 

在需要调用PerOrder函数地方取函数指针

  1. void XXXX::OnButtonPreorder()   
  2. {  
  3.  int (CMyTreeDlg::*pfunc)(TreeNode *); //声明一个和参数类型一样的函数指针  
  4.    
  5.  pfunc =& CMyTreeDlg::CreateVisitList; //指针指向要调用的函数  
  6.  PreOrder(m_pTree,pfunc);  //将声明的指针看作参数传入  
  7. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值