2011-01-12 6 views
0

멤버 함수의 주소를 가져 오려고하는데 어떻게해야할지 모르겠다. 누군가 내가 잘못하고있는 것을 말할 수 있다면 고맙겠습니다. 당신이 아래에있는 내 예에서 볼 수 있듯이,도 (긴) & g도 (긴) & this-> g 작업과 내가 올바른 구문을 알아낼 수 없습니다 : 사전에이 포인터와 멤버 함수 주소

/* Create a class that (redundantly) performs data member selection 
and a member function call using the this keyword (which refers to the 
address of the current object). */ 

#include<iostream> 
using namespace std; 

#define PR(STR) cout << #STR ": " << STR << endl; 

class test 
{ 
public: 
    int a, b; 
    int c[10]; 
    void g(); 
}; 

void f() 
{ 
    cout << "calling f()" << endl; 
} 

void test::g() 
{ 
    this->a = 5; 
    PR((long)&a); 
    PR((long)&b); 
    PR((long)&this->b);  // this-> is redundant 
    PR((long)&this->c);  // = c[0] 
    PR((long)&this->c[1]); 
    PR((long)&f); 
// PR((long)&g);  // this doesn't work 
// PR((long)&this->g);  // neither does this 

    cout << endl; 
} 

int main() 
{ 
    test t; 
    t.g(); 
} 

감사합니다!


답장을 보내 주셔서 감사합니다. 그러나 나는 아직도 그것을 작동시키지 않는다. 내가

PR((long)&test::g); 

에 선

PR((long)&g); 

를 변경하는 경우, 그것은 여전히 ​​작동하지 않습니다.

PR(&test::g); 

() 주에서 작동하지만하지

PR((long)&test::g); 

???

나는 뭔가를 놓치고 있다고 생각합니다. :(

+0

주소가 반드시 숫자 일 필요는 없습니다 (너무 길면 충분하지 않을 수도 있음). 캐스트 (void *) 스트림 코드는 그냥 주소를 인쇄합니다. –

답변

1

당신은 클래스 이름과 멤버 함수를 앞에해야합니다.

&test::g; 

멤버 함수 (또는 방법) 클래스가 아닌 특정 인스턴스에 바인딩 또한

1

을 수행 할 수 있습니다 직접 포인터를 표시하려면 다음 형식을 사용

의 printf ("% p를"& 시험 :: g)

내 컴퓨터에서 "008C1186"를 인쇄합니다.