Pointer-to-Member演算子の理解

私はこのプログラムをC ++の練習帳からコピーしました。舞台裏では何が起こっているのですか?

予想される出力は次のとおりです。

合計= 30合計= 70

#include
using namespace std;

class M
{
    int x;
    int y;
public:
    void set_xy(int a, int b)
    {
        x=a;
        y=b;
    }
    friend int sum(M m);
};

int sum (M m);
//so far so good, problem begins from here. what's happening after here?
{                               
    int M ::*px = &M ::x;
    int M ::*py = &M ::y;
    M *pm =&m;
    int s= m.*px+ pm->*py;
    return s;
}

int main()
{
    M n;
    void (M :: *pf)(int, int) = &M ::set_xy;
    (n.*pf)(10, 20);
    cout <<"sum=" << sum(n) << endl;

    M *op= &n;
    (op-> *pf)(30,40);
    cout << "sum=" << sum(n)<< endl;

    cin.ignore();
    getchar();
    return 0;
}
6
コンパイラ特有の問題ではないので、タグ "visual-studio"を削除する
追加された 著者 iammilind,
@ jeet.mg、はいコマンドはVS用ですが、コンパイラエラーの問題はありません
追加された 著者 iammilind,
" - > *"は2つではなく1つの演算子です。だから彼らは分かれない。 「 - > *」と書くことはできません。
追加された 著者 fefe,
その問題は解決されます。誰かがそれが働いていると説明できますか?
追加された 著者 user1103138,
cin.ignore(); getchar();ビジュアルスタジオのコマンドです。
追加された 著者 user1103138,

3 答え

The problem is because of extra whitespace at op-> *pf:

 (op->*pf)(30,40); //ok

I think @fefe has probably said the reason in comment. ->* is a single operator, similar to .*. So, if those 2 are separated, then it will result in different syntax, which gives compiler error.

1
追加された
@ jeet.mg、それは別の質問です。あなたのコードを最初に見なければならないかもしれませんし、理解できない場合は別の質問を投稿することができます。
追加された 著者 iammilind,
@ jeet.mg:演算子は - > * です。 delete delete と同じではありません。
追加された 著者 Mat,
私はどこかでC ++が空白を気にしないと読んでいます。それがうまくいくかどうか試してみましょう。
追加された 著者 user1103138,
ええ、それは働いている:)今何が起こっている。
追加された 著者 user1103138,
その問題は解決されます。誰かがそれが働いていると説明できますか?
追加された 著者 user1103138,

iammilind bet me to the error; op-> *pf must be changed so that you have ->* together as a single operator - a pointer to member operator (couldn't find a better link). The whitespace in op ->* pf is perfectly valid.

これは i ++ のようなものと同じです。 ++ は単一の演算子で、 i ++ を試してみるとエラーが発生します。

今何をしているのか。この例は、メンバーへのポインタ関数です。 pf は、 void の戻り値を持つ2つの int 引数を取るクラスM のメンバー関数として宣言されています。これは、 M :: set_xy 関数を指すように初期化されています。

main の中に:

  • n is of type M, therefore in order to use pf to call set_xy of n you'd use the .* operator: (n.*pf)(10, 20);. That's equivalent to n.set_xy(10, 20);.

  • Since op is of type M* (a pointer to an M object), you'll need to use the ->* operator and call the function pointed to by pf as: (op->*pf)(30, 40);, which is equivalent to op->set_xy(30, 40);

sum の中に:

  • この例は、メンバ関数とは対照的に、メンバ変数とインスタンス変数を指すポインタです。

    これらのタイプのポインタを使用して m.x m.y

1
追加された

Take a look at Pointer to class data. And for the error, ->* is an operator, you can't put a space between them.

1
追加された
.........................クール:)
追加された 著者 user1103138,