этот указатель и адрес функции-члена

Я пытаюсь получить адрес функции-члена, но не знаю, как это сделать. Я был бы признателен, если бы кто-нибудь мог сказать мне, что я делаю неправильно. Как вы можете видеть в моем примере ниже, ни (long)&g, ни (long)&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)&g );

to

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

, все равно не работает.

PR( &test::g );

работает в main(), но не

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

???

Я думаю, что я что-то упускаю. :(


person Markstar    schedule 12.01.2011    source источник
comment
Адрес не обязательно цифры (поэтому долго может не хватить). Приведение к (void*) коду потока будет просто печатать адрес.   -  person Martin York    schedule 12.01.2011


Ответы (2)


Вы должны префикс функции-члена с именем класса:

&test::g;

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

person Nekresh    schedule 12.01.2011

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

printf("%p", &test::g);

Что печатает "008C1186" на моей машине.

person overscore    schedule 12.01.2011