6

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

期待される出力は次のとおりです。

合計=30合計=70

#include<iostream>
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;
}
4

3 に答える 3

1

問題は、次の場所に余分な空白があるためop-> *pfです。

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

@fefeはおそらくコメントで理由を言っていると思います。->*は、と同様の単一の演算子.*です。したがって、これら2つが分離されていると、構文が異なり、コンパイラエラーが発生します。

于 2011-12-19T06:22:32.293 に答える
1

クラスデータへのポインタを見てください。また、エラーの場合、-> *は演算子であるため、間にスペースを入れることはできません。

于 2011-12-19T06:26:37.873 に答える
1

iammilindは私にエラーを賭けました。単一の演算子として一緒にop-> *pfなるように変更する必要があります-メンバー演算子へのポインター(より良いリンクを見つけることができませんでした)。の空白は完全に有効です。->*op ->* pf

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

今それがしていることのために。この例は、メンバー関数へのポインターです。pfは、のメンバー関数として宣言されています。これは、戻り型を持つ2つの引数をclass M取ります。関数を指すように初期化されています。intvoidM::set_xy

内部main

  • nはタイプMであるため、のpf呼び出しset_xyに使用するにnは、.*演算子を使用します(n.*pf)(10, 20);。これは。と同等n.set_xy(10, 20);です。

  • opはタイプM*(オブジェクトへのポインタ)であるため、演算子Mを使用して、次のように指す関数を呼び出す必要があります。これは、と同等です。->*pf(op->*pf)(30, 40);op->set_xy(30, 40);

内部sum

  • 例は、メンバー関数ではなく、単にメンバー/インスタンス変数へのポインターです。これは、これらのタイプのポインターをどのように足し合わせm.xて使用​​するかを示しているだけです。m.y
于 2011-12-19T06:40:21.997 に答える