【问题标题】:C++ Passing a pointer to a member function as an argumentC ++将指向成员函数的指针作为参数传递
【发布时间】:2012-07-22 15:52:24
【问题描述】:

我需要将指向成员函数的指针作为参数传递给另一个类中的成员函数。我正在做的是如下所示。 我想用 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* ()(void), 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();
}

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    【讨论】:

    • 你能告诉我如何使用静态函数解决这个问题。这个我不是很清楚
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      应该帮助你调用一个成员函数。 使用指向成员函数调用语法的指针调用它:

      (objectPointer->*functionPointer)();
      

      【讨论】:

      • 使用静态函数对我来说不是很清楚。我可以通过将以下函数声明为静态来做到这一点吗?但它给出了同样的错误。 void* ProcessHandler::Task(void* a) { //任务相关代码放在这里 }
      • @user1308004 从技术上讲,是的,就像那样。 static void* ProcessHandler::Task(void* a);在头文件和 CPP 文件中的 void* ProcessHandler::Task(void* a) 中。您可以使用函数签名 void * (*)(void); 指向该指针。在此处查看更多信息:parashift.com/c++-faq/fnptr-vs-memfnptr-types.html
      • 函数调用的语法是(objectPointer->*functionPointer)();
      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 2020-06-09
      • 2012-06-27
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      相关资源
      最近更新 更多