在編寫二叉樹圖形化演示程序的時候,要實現二叉樹的前序,中序、後序遍歷,遍歷的時候傳入一個函數指針來處理遍歷到的節點
void XXXX::InOrder(TreeNode * Tree,int (*func)(TreeNode * Tree))
{
if( ! Tree ) return ;
InOrder(Tree->lchild,func);
if ( !func(Tree) ) return;
InOrder(Tree->rchild,func);}
}
另外有一個成員函數:目的是作爲函數指針(節點處理函數)
int XXXX::VisitList(TreeNode *Tree)
{
//Do Sth
return 1;
}
但是在c++裏面,將成員函數作爲函數指針傳入的時候會提示類型不匹配調用的時候 PreOrder(m_pTree,VisitList);會有下面的錯誤提示:
error C2664: 'PreOrder' : cannot convert parameter 2 from 'int (struct tagTreeNode *)' to 'int (__cdecl *)(struct tagTreeNode *)'
None of the functions with this name in scope match the target type
這個是因爲成員函數和函數指針處理的編譯模式 不一樣
一個是thiscall,一個是__cdecl
解決方案:
修改有參數爲成員函數指針的函數如下:
void XXXX::PreOrder(TreeNode * Tree,int (CMyTreeDlg::*func)(TreeNode * Tree))
{
if( ! Tree ) return ;
if ( !( this->*func)(Tree) )
return;
PreOrder(Tree->lchild,func);
PreOrder(Tree->rchild,func);
}
在需要調用PerOrder函數地方取函數指針
void XXXX::OnButtonPreorder()
{
int (CMyTreeDlg::*pfunc)(TreeNode *); //聲明一個和參數類型一樣的函數指針
pfunc =& CMyTreeDlg::CreateVisitList; //指針指向要調用的函數
PreOrder(m_pTree,pfunc); //將聲明的指針看作參數傳入
}