传递非静态成员函数作为参数

时间:2014-05-30 13:18:54

标签: c++ callback function-pointers binary-search-tree non-static

SalesMap.h摘录 -

typedef BST<Sales> BinarySearchTree;//type defined for Sales_Map construction
typedef map<Date, BinarySearchTree> sales_map;//type defined for map construction
sales_map Sales_Map;

SalesMap.cpp摘录 -

最高和SetHigh都是公开的

void SalesMap::Highest(){
    void (SalesMap::*SetHighPTR)(Sales);//create non-static function pointer
    SetHighPTR = &SalesMap::SetHigh; //assign address of function void SetHigh(Sales sales)
    //it is an iterator to a specific element in Sales_Map
    it->second.InSearch(&SetHighPTR); // pass SetHigh into BST object function InSearch
}

void SalesMap::SetHigh(Sales sales)//test input sales object against global highprice variable
{
    double price = sales.GetPrice();
    if(price < high)
        high = price;
}

BST.h

Public:
     void InSearch(void (*f)(T) );//calls recursive InSearch function
Private:
      void InSearch(node*& leaf, void (*f)(T) );

template <class T>//public InSearch
void BST<T>::InSearch( void (*f)(T) )
{
    InSearch(root, (*f));
}

template <class T>//Private InSearch
void BST<T>::InSearch(node*& leaf, void (*f)(T))
{
    if(leaf != NULL)
    {
        InSearch(leaf->left);
        (*f)(key);
        InSearch(leaf->right);
    }
}

我正在尝试在BST.h中创建一个回调函数。 我一直收到以下错误:

error C2664: 'void BST<T>::InSearch(void (__cdecl *)(T))' : cannot convert parameter 1 from 'void (__thiscall SalesMap::* )(Sales)' to 'void (__cdecl *)(T)'

我不确定此问题所需的正确语法,无法弄清楚我应该做什么以及在哪里做什么。 任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

问题基本上是你试图将成员函数指针转换为函数指针,这在C ++中根本不可能,因为成员函数指针总是需要一个被调用的对象。 (this需要指向某处)

类的静态方法不需要任何对象,因此也是函数指针。

如果要使用成员函数指针,则InSearch方法应具有以下参数:

template <class T>//public InSearch
void BST<T>::InSearch( void (SalesMap::*f)(T) )

然后你需要一个类型为SalesMap的对象或任何派生类来调用这个方法:

//Using an object pointer
(mySalesObjectPtr->*f)(key);
//No pointer
(mySalesObject.*f)(key);

当然,你可以为函数指针创建一个重载,就像你已经完成的那样,它适用于全局函数和静态方法。

this article的开头很好地概述了这两种类型的函数指针。

答案 1 :(得分:0)

当您要从成员类外部传递成员函数的函数指针时,这是一个基本示例。

class A
{
private:
    void(A::*m_myFuncPointer)(); ///declaring a private member function pointer

public:
    void init( void(A::*someFunc)() ){
        m_myFuncPointer = someFunc;    ///stores the function pointer
        (this->*m_myFuncPointer)();    ///calls the function using member function
    }  
    void execute(){
        std::cout<<"hello"<<std::endl;
    }
 };

int main()
{
    A a;
    a.init(&A::execute);
}