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

アドレス取得演算子を介してのみ静的メンバー関数を渡すことができます。通常のメンバー関数は機能しません。std::function の使用を検討する必要があります。

于 2012-07-24T10:36:25.103 に答える
1

C++ では、関数へのポインターを使用しないことをお勧めします (生のポインターも議論の余地があります)。より一般性を高めるには、std::function(boost::function) またはテンプレートを使用する必要があります。後者は少しパフォーマンスを向上させますが、型チェックは少なくなります。

于 2012-07-24T10:47:44.660 に答える
0

void ( _pFunc)(void*) は C 関数ポインターであるため、そのポインターを介して C 関数を渡すか、静的関数のみを渡すことができます。

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

メンバー関数を呼び出すのに役立ちます。メンバー関数呼び出し構文へのポインターを使用して呼び出します。

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