1

通常、C ++では、クラスAがクラスBとの友情を宣言すると、クラスBはクラスAのプライベートメンバーに完全にアクセスできます。私がする必要があるのは、クラスBがクラスAの1人のプライベートメンバーにのみアクセスできるようにし、他には何もアクセスできないようにすることです。そのための方法はありますか、おそらくC ++ 11で何か新しいものがありますか?

4

2 に答える 2

4

私が知っていることではありません。単一のメンバーへのアクセスのみを許可することが非常に重要な場合は、C完全にプライベートメンバーを持つ別のクラス()でデータをラップし、そのクラスをのフレンドにして、のオブジェクトBのパブリックアクセサーを提供できます。CA

このようなもの:

template<class T> class MatesWithB
{
     friend class B;

  public:
     MatesWithB( T & val ) : data(val) {}

  private:
     T& data;
     operator T&()             { return data; }
     operator const T&() const { return data; }
};

class A
{
      // ...
      MatesWithB<int> GetPrivateThingy() { return MatesWithB(thingy); }

   private:
      int thingy;            // Shared with class B
};

そんな感じ。私はこれをコンパイラーで実行してチェックしていません。

しかし、私はただ疑問に思います...あなたがこれをする必要があることに気付いたとき、あなたのデザインの何かが根本的に欠陥がありませんか?

于 2013-02-11T22:43:02.727 に答える
1

そもそも友達機能を持っている正当な理由があるとすれば、友達機能が触れるべきもの以外のものに触れないように「信頼」することに何の問題もありません。

クラスのアドレスを持つ[または何らかの方法でアドレスに到達できる]関数は、その関数が必要に応じてメンバー変数を変更できることに注意してください。ポータブルで将来的に安全で信頼性の高い方法でそれを行うことはできないかもしれませんが、へのポインタをキャストするchar *と、オペレーティングシステムによって特定されていないクラス内のすべてを変更できます。

、、、、などに関するポイントはprivate、コンパイラーが「コントラクトに従っている」ことを確認できるようにすることですが、そうすることを決意した「賢い」プログラマーによってオーバーライドされる可能性があります。この「コントラクト」の一部として、クラスまたは関数は、それが友人であるクラス内のすべてのものに触れることが許可されます。そうです。あなたがそれを望まないのなら、あなたはそれを友達と宣言するべきではありません... protectedpublicfriendfriend

于 2013-02-11T22:45:01.450 に答える