2

「c++ で考える」という本で言及されている演習の 1 つを参照しています。以下のコード スニペットは、呼び出し h.play に対してエラーをスローします。メンバー i がプライベートであるため、私は理解しています。 call me.play. call h.play にコメントを付けると、コードは正常にコンパイルされます. call me.play でエラーが発生しないのはなぜですか?

class Buddy {};

template<class T> class My {
  int i;
public:
  void play(My<Buddy>& s) {
    s.i = 3;
  }
};

int main() {
  My<int> h;
  My<Buddy> me, bud;
  h.play(bud);
  me.play(bud);
}

ありがとうございました。

[編集]コンパイラが生成したコードを確認する方法はありますか

My<int> h and 
My<Buddy> me 

? (-E コンパイラ フラグに似たもの) ?

4

3 に答える 3

1

メンバーは、同じタイプの別のオブジェクトのインスタンスに対して常に「パブリック」です。

My<Buddy>インスタンス ( など) が別のインスタンス ( など)meのプライベート メンバーにアクセスできることを意味します。My<Buddy>bud

My<int>は とはまったく異なる型であるMy<Buddy>ため、これらのメンバーにアクセスできないことに注意してください。

于 2013-04-02T00:37:11.930 に答える
0

メソッドはではなくplayへの参照を取るように定義されているため、の別のインスタンスで呼び出された場合、有効なクラスは同じ型になります。したがって、プライベート メンバーにアクセスできます。My<Buddy>My<T>My<Buddy>

于 2013-04-02T00:37:21.520 に答える