2012-06-28 3 views
1

이것은 나를 막았습니다. 정적 (비 정적) 멤버 함수에 대한 포인터 인 정적 클래스 변수를 갖고 싶습니다. 나는 여러 가지 방법을 시도했지만 아무런 운이 없었습니다 (typedef을 사용하는 것을 포함하여, 다른 오류 세트를 줄 것 같았습니다). 아래 코드에서 정적 클래스 함수 포인터 funcptr이 있는데 클래스 외부에서 성공적으로 호출 할 수 있지만 멤버 함수 CallFuncptr 내에서 호출하지 못했습니다. 원하는 작업입니다. 어떤 제안?정적 멤버 함수 포인터가 아닌 정적 멤버 함수를 보유하려면

#include <stdio.h> 

class A 
{ 
public: 
    static int (A::*funcptr)(); 
    int Four() { return 4;}; 
    int CallFuncptr() { return (this->*funcptr)(); } 
     // doesn't link - undefined reference to `A::funcptr' 
}; 
int (A::*funcptr)() = &A::Four; 

int main() 
{ 
    A fred; 
    printf("four? %d\n", (fred.*funcptr)()); // This works 
    printf("four? %d\n", fred.CallFuncptr()); // But this is the way I want to call it 
} 

답변

3

대신을 시도해보십시오

#include <iostream> 

class A { 
public: 
    typedef int (A::*AMemFn)(); 
    static AMemFn funcptr; 
    int Four() { return 4; } 
    int CallFuncptr() { return (this->*funcptr)(); } 
}; 

A::AMemFn A::funcptr = &A::Four; 

int main() 
{ 
    A fred; 
    std::cout << "four? " << fred.CallFuncptr() << std::endl; 
} 
+0

많은 도움을 주셔서 감사합니다! – bandjalong

0

정적 변수가 특정 객체의 멤버가 아닙니다 - 그것은 단지 클래스 네임 스페이스를 통해 액세스 할 수 있습니다. CallFuncptr은 다시 작성해야합니다 : int CallFuncptr() { return (*funcptr)(); 이 함수는 A의 네임 스페이스에있는 함수를 지정하지 않고 액세스 할 수 있기 때문에 작동해야한다고 생각합니다.

또한 함수 포인터는 C++보다 C 구조입니다. 당신은 코드를 클래스 외부 정적 변수에 액세스 할 수 있습니다 A::CallFuncptr CallFunctptr 단지의 네임 스페이스 (내가 제안 당신이 그것을 사용) 주위에 좋은 찾고 일을 가지고 jweyrich

2

에있는,하지만 난 정교한 거라고 생각하기 때문에 의 코드에 진짜 문제가 무엇인지 :

귀하의 문제는이 라인 :

int (A::*funcptr)() = &A::Four; 

이 오히려 A::funcptr보다 오른쪽 유형 인 funcptr라는 전역 변수를 정의한다.

int (A::*(A::funcptr))() = &A::Four; 

난 당신이 jweyrich의 솔루션과 같은 좋은 찾고 버전을 얻을 수있는 타입 정의의 경로를 아래로 이동하시기 바랍니다이 추한 엉망입니다 : 당신이 필요로하는 무엇

이 엉망이다.

+0

아, 고마워! .. 나는 그 라인을 따라 생각하고 있었다. 단지 두 번째 A ::를 부착하는 방법을 추측 할 수 없었다. 정말로 조금 분명하지 않습니다 .. – bandjalong