2017-01-27 28 views
2

こんにちは、私はprivate scopeの下に会員データとしてメンバ関数へのポインタを宣言し、getterは、外部からそれを得るために作りたい:ptrがあるクラスAのメンバーであり、メンバ関数へのポインタを返すメンバ関数の作成方法は?

class A 
{ 
    public: 
     A(){ ptr = Foo;} // for example: ok 
     void Foo(){ cout << "Foo()" << endl;} 
     void Bar(){ cout << "Bar()" << endl;}; 

     void (A::*)() GetPtrFunc() {return ptr;} // error here? 

    private: 
     void (A::*ptr)(); // ok here 
}; 

あなたが見ることができるように私は外からそれを使用することはできませんので、ゲッターでそれを返す方法は同じクラスのメンバークラスへのポインタですか?

+0

'void(A :: * GetPtrFunc)()' – DeiDei

答えて

4

この宣言を書き出す方法がありますが、あなたはそれがあまり混乱typedef使用することができます:

typedef void (A::*mem_func_ptr)(); 

    mem_func_ptr GetPtrFunc() {return ptr;} 

private: 
    mem_func_ptr ptr; // ok here 

はまた、あなたの初期化は、コンストラクタで、正しくありませんでした。フル、例を修正:

#include <iostream> 
using namespace std; 

class A 
{ 
    public: 
     A(){ ptr = &A::Foo;} 
     void Foo(){ cout << "Foo()" << endl;} 
     void Bar(){ cout << "Bar()" << endl;}; 

     typedef void (A::*mem_func_ptr)(); 

     mem_func_ptr GetPtrFunc() {return ptr;} // error here? 

    private: 
     mem_func_ptr ptr; // ok here 
}; 
+0

は魅力のように動作しました。 –

+0

唯一のこと@Sam:ptr: 'aObj.GetPtrFunc()()'によって指されたその関数を呼び出す方法は? –

+0

'aObj.getPtrFunc()'はクラスメソッドへのポインタを返します。余分な '()'のペアをたたくだけで呼び出すことができる関数へのポインタではありません。同じオブジェクトで呼び出す場合は、 '(aObj。*(aObj.getPtrFunc()))()'を実行します。 'C++'本を開き、 '。*'演算子の説明を読んでください。 –

2

あなたはptrGetPtrFuncを移動し、それをdecltype(ptr)を宣言することができます。

private: 
    void (A::*ptr)() = &A::Foo; 
public: 
    decltype(ptr) GetPtrFunc() { return ptr; }; 

か(順序制約なし)だけautoそれを宣言し、cretigはJarod42 @に行き、 @ user975989

auto GetPtrFunc() { return ptr; }; 
+0

'auto'で十分でしょう。 – Jarod42

+0

もしあなたが一般的なルートに行くのであれば、なぜ 'auto'なのでしょうか? – user975989

+0

@ Jarod42確かに、感謝、更新、ありがとう! – AlexD

関連する問題