2012-03-30 5 views
4

클래스 내부에 함수 포인터를 정의하고 클래스 인스턴스를 통해 액세스하려고하지만 오류가 표시됩니다.클래스 내부 함수 포인터 액세스

1 #include<stdio.h> 
2 
3 class pointer { 
4 public: 
5 int (pointer::*funcPtr)(int); 
6 pointer() { 
7  funcPtr = &pointer::check; 
8 } 
9 
10 
11 int check(int a) 
12 { 
13  return 0; 
14 } 
15 
16 }; 
17 
18 int main() 
19 { 
20 pointer *pt=new pointer; 
21 return (pt->*funcPtr)(3); 
22 } 

그것은 컴파일 타임 오류를 보여줍니다 :

checkPointer.cpp:21:15: error: ‘funcPtr’ was not declared in this scope 

저를 도와주세요 여기

는 코드입니다.

미리 감사드립니다.

+0

+1 스택 오버플로에 오신 것을 환영합니다! 완벽하고 간결한 테스트 케이스를 제공해 주셔서 감사합니다. 왜 모두가 그랬 으면 좋겠는지 http://sscce.org를 참조하십시오. –

답변

2

여기서 funcPtr은 pt 내부에서 선언되므로 pt라는 이름을 두 번 사용해야합니다. 한 번은 포인터를 구성원 선택 항목의 왼쪽으로, 한 번은 포인터 클래스를 선택해야합니다 있는 funcPtr를 선택합니다 :

(fn->*(fn->funcPtr))(3); 

그 이유는 잠재적 함수가 포인터의 다른 인스턴스에서 포인터의 한 인스턴스의 funcPtr 멤버가 가리키는 부를 수 있다는 것입니다.

희망이 도움이됩니다.

+0

당신이 return (pt -> * pt -> pointer :: funcPtr)을 의미한다고 생각합니다 (3); – fschmitt

+0

@ fschmitt- 나는 그렇게 생각하지 않습니다. funcPtr은 내가 선택하고자하는 pt의 데이터 멤버의 이름입니다. 멤버 함수에 대한 포인터를 선택하기 위해 범위 분석을 사용할 필요가 없습니다. – templatetypedef

1

을 의미 생각합니다. 일반적으로, 그 저자는 typedef들과 #define들 피할 수 있지만,이 경우에 그는 예외합니다 :

#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) 
… 
    CALL_MEMBER_FN(*pt, pt->funcPtr)(3) 

추신을 이 지침을 따르지 않더라도 해당 페이지를 읽으십시오. 멤버 함수에 대한 포인터에 대한 많은 유용한 정보가 있습니다.