2016-05-01 14 views
2

クラスメソッドへの関数ポインタの作成に問題があります。私は非クラスメソッドへの関数ポインタを作って、それは正常に動作します。C++クラスメソッドへの関数ポインタの作成方法

int foo(){ 
    return 5; 
} 

int main() 
{ 
    int (*pointer)() = foo; 

    std::cout << pointer(); 

    return 0; 
} 

これを適用して、クラス内のインスタンス変数を関数ポインタにすることを試みました。

これはヘッダーファイルです。変数メソッドが指すプライベートメソッドPrintを宣言します。

class Game 
{ 

public: 

    Game(); 

private: 

    void Print(); 

    void (method)(void); 

}; 

ゲームコンストラクタは、ポインタメソッドをPrintメソッドのアドレスに割り当てようとします。コンパイル時に、その行に "error:非静的メンバー関数への参照を呼び出さなければならない;"というエラーが表示されます。私はそれが何を意味するのか分かりません。これを実装する正しい方法は何ですか?

Game::Game(void) 
{ 

    method = &Game::Print; 

} 

void Game::Print(){ 
    std::cout << "PRINT"; 
} 
+0

一種の厄介だ;'あなたがのメンバ関数を使用したい場合何も返さずパラメータを持たない 'Game'クラスです。 –

答えて

2

メンバ関数は通常の関数とかなり異なっているので、あなたは、メンバ関数を指すようにしたいときは、単なる関数へのポインタ、ポインタ・ツー・メンバー関数をする必要はありません。これは、メンバ関数へのポインタを保持mptrと命名へのポインタメンバ関数を定義

void (Game::*mptr)(); 

:ポインタ・ツー・メンバ関数の構文は、メンバ関数がメンバであるクラスを含みます引数なしで何も返さないクラスGames

void (*ptr)(); 

これは、関数へのポインタptrという名前の引数を取らず、何も返さない関数へのポインタを保持して定義された:通常の関数ポインタであることと対比。

+0

それは動作します。私がメソッドを呼び出すことができる唯一の方法は '(this - > * method)();'それを呼び出す方がいいですか? – j76goatboy

+0

違いは、(静的でない)メンバ関数をオブジェクトに対して呼び出さなければならないという点です。それは 'this - > *'がするものです。 –

0

はちょうどあなたが

#include <functional> 
#include <cassert> 

using namespace std; 

struct Foo { 
    int x; 
    int foo() { return x; } 
}; 

int main() { 
    function<int(Foo&)> f = &Foo::foo; 
    Foo foo = { 3 }; 
    assert(f(foo) == 3); 
    foo.x = 5; 
    assert(f(foo) == 5); 
} 

を行うことができますがわかった。しかし、それはあなたが `無効(ゲーム:: *()メソッド)必要IMO

関連する問題