2016-11-11 28 views
-1

クラスをインスタンス化するメンバ関数を関数ポインタとして使用するにはどうすればよいですか? BEFOREC++ | funcポインタとしてメンバ関数を使用する方法

main.cpp : 

void packetShower(data_t const& data) { 
     // showing so data 
    } 

.... 

// called with : 
std::shared_ptr<Net::ARawSocket> rawSock = std::make_shared<Net::LinuxRawSocket>(packetShower); 

とそれは単に動作します。 packetShower機能は今私main.cpp

に単純な静的メソッドだった:

は私が、私のrun()方法では、packetShowerインスタンス機能

namespace App { 
class Instance { 
public: 
    Instance() = default; 
    ~Instance() = default; 

    int run(int ac, char *av[]); 
private: 
    void init(); 

    void packetShower(data_t const& data) 
    }; 
} 

でインスタンス化クラスInstanceを持っており、私のpacketShower関数への関数ポインタを作成しようとしてください:

namespace App { 

void Instance::init() { 
... 
} 

void Instance::packetShower(data_t const& data) { 
     ..... 
} 

int Instance::run(int argc, char** argv) { 
    init(); 

    // and I tried : 

     void (Instance::*shower)(data_t const& data) = &Instance::packetShower; 

     std::shared_ptr<Net::ARawSocket> rawSock = std::make_shared<Net::LinuxRawSocket>(shower); 


    // but It generate a big error 

    } 
} 

どうすればいいですか?

ありがとうございます!

+0

'Net :: LinuxRawSocket' ctorはどのようなタイプを受け入れますか? – Slava

+0

私は次のエラーが発生します: 'Net :: LinuxRawSocket :: LinuxRawSocket(void(App :: Instance :: **)(const std :: vector &))'への呼び出しで一致する関数がありません。 ' しかし、私が言ったように、これを行う前の方法はfuncポインタで壊されていましたが、今はインスタンスメンバのfuncポインタを使って行います – F4Ke

+0

私の質問を読んで理解できますか?私はそれを言い換えることができます。 'Net :: LinuxRawSocket'コンストラクタでコールバックとして受け入れられる型の定義を提供できますか? – Slava

答えて

0

とし、Instance::packetShowershowerと指定します。

あなたは、関数の宣言を変更することが許された場合、関数ポインタがコールバックとして使用されようとしている場合は、thisポインタは、ユーザデータとして渡すことができ、次のようにpacketShowerの宣言は変更します

class Instance { 
... 
    static void packetShower(data_t const& data, void *userData) { 
     Instance *i = (Instance)userData; 
     ... 
    } 
... 
}; 
関連する問題