c++ 成員函數作爲函數指針參數傳入

       在編寫二叉樹圖形化演示程序的時候,要實現二叉樹的前序,中序、後序遍歷,遍歷的時候傳入一個函數指針來處理遍歷到的節點

 

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);  //將聲明的指針看作參數傳入
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章