2017-01-27 2 views
2

안녕하세요 내가 private scope에서 멤버 데이터와 멤버 함수에 대한 포인터를 선언하고 외부에서 그것을 얻을 수있는 getter을 만들고 싶어 :멤버 함수에 대한 포인터를 반환하는 멤버 함수를 만드는 방법은 무엇입니까?

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 
}; 

당신이 볼 수 있듯이, ptr는 클래스 A의 구성원 인 동일한 클래스의 멤버 클래스에 대한 포인터로 외부에서 사용할 수 없으므로 getter로 반환하는 방법은 무엇입니까?

+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와 @로 이동 @ 사용자 975989 :

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

'자동'충분 btw 것입니다. – Jarod42

+0

일반 경로를 'auto'로 설정하지 않으려면 어떻게해야합니까? – user975989

+0

@ Jarod42 물론, 의미심장 한, 업데이트, 감사합니다! – AlexD

관련 문제