0

メンバー関数のアドレスを取得しようとしていますが、方法がわかりません。誰かが私が間違っていることを教えていただければ幸いです。以下の例でわかるように、 (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 );

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

、まだ機能しません。

PR( &test::g );

main() で動作しますが、動作しません

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

???

私は何かが欠けていると思います。:(

4

2 に答える 2

1

メンバー関数の前にクラス名を付ける必要があります。

&test::g;

メンバー関数 (またはメソッド) は、特定のインスタンス化ではなく、クラスにバインドされます。

于 2011-01-12T13:24:13.800 に答える
1

また、次の形式を使用してポインターを直接表示することもできます。

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

私のマシンに「008C1186」と表示されます。

于 2011-01-12T13:32:42.677 に答える