1

我需要将指向成员函数的指针作为参数传递给另一个类中的成员函数。我正在做的是如下所示。我想用 void* ProcessHandler::Task(void* a) 作为第一个参数来调用 int Processor::AddJob(void ( _pFunc)(void*), void* _pArg) 方法。我这样做了

TaskFunc pFunc1 = &ProcessHandler::Task;
p_Processor->AddJob(pFunc1,10);

但它给出了错误

错误:没有用于调用 Processor::AddJob(void* (ProcessHandler:: &)(void ), int)' Processor.h:47 的匹配函数:注意:候选者是:int Processor::AddJob(void* ( )(无效),无效*)

有人可以帮我解决这个问题吗?我的实现如下。(不是确切的代码 - 它比这大得多)

class Processor 
{
public:
    Processor();
    virtual ~Processor();

    int AddJob(void *(*_pFunc)(void*), void* _pArg);
};

int Processor::AddJob(void *(*_pFunc)(void*), void* _pArg)
{
    //Job addition related code goes here
}


/////////////////////////////////////////////////////////////////////////////
typedef void* (ProcessHandler::*TaskFunc)(void*); 
class ProcessHandler
{
public:
    ProcessHandler(Processor* _pProcessor);
    virtual ~ProcessHandler();
    void* Task(void* a);
    void Init();

private:
    Processor* p_Processor;
};


void* ProcessHandler::Task(void* a)
{
    //Task related code goes here
}

void ProcessHandler::Init()
{
    TaskFunc pFunc1 = &ProcessHandler::Task;
    p_Processor->AddJob(pFunc1,10); //This give the compile error.
}

/////////////////////////////////////////////////////////////////////////
int main()
{
    Processor* pProcessor = new Processor();
    ProcessHandler* pProcessHandler = new ProcessHandler(pProcessor);
    pProcessHandler->Init();
}
4

3 回答 3

3

您只能通过 address-of 运算符传递静态成员函数。常规成员函数不起作用。您应该考虑使用 std::function。

于 2012-07-24T10:36:25.103 回答
1

在 C++ 中,我建议 do_NOT 使用指向函数的指针(原始指针也是有争议的)。您应该使用 std::function(boost::function) 以获得更多通用性或模板。后者给你一点性能,但更少的类型检查。

于 2012-07-24T10:47:44.660 回答
0

void ( _pFunc)(void*) 是一个 C-Function 指针,因此,您只能通过该指针或静态函数传递 C-Function。

void (ProcessHandler::*)(void); //Since you already have a Typedef, pass that as 'type'

应该可以帮助您调用成员函数。使用指向成员函数调用语法的指针调用它:

(objectPointer->*functionPointer)();
于 2012-07-24T10:41:48.553 回答