2011-01-12 5 views
0

Я пытаюсь получить адрес функции-члена, но я не знаю, как это сделать. Я был бы признателен, если бы кто-нибудь мог сказать мне, что я делаю неправильно. Как вы можете увидеть в моем примере ниже, ни (длинный) & г, ни (длинный) & this-> г работа, и я не могу понять правильный синтаксис:этот адрес указатель и функция функции члена

/* 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)&g); 

в

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

, она до сих пор не работает.

PR(&test::g); 

работает в главной(), но не

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

???

Я думаю, что у меня что-то не хватает. :(

+0

Адрес не обязательно числа (так долго может быть недостаточно). Приведение в действие (void *) код потока затем просто распечатает адрес. –

ответ

1

Вы должны предварить функцию член с именем класса:.

&test::g; 

функция-член (или метод) связан с классом, а не конкретный экземпляра

1

Кроме того, вы можете используйте следующий формат, чтобы показать указатели непосредственно:

Е ("% P", & тест :: г);

который печатает "008C1186" на моей машине.