ウィンドウの親と子のダイアログクラスを作成するときは、一般的に、子クラスを親クラスのフレンドにしてプライベートデータにアクセスさせるか、アクセサー関数を使用するのが良いでしょうか?これは友人関係の適切な使用ですか?
答えて
IMHO、ほとんど決してありません。
「友人」は、外部エンティティがクラスのプライベートデータにアクセスすることを許可するという点で、カプセル化を中断する傾向があることがよくあります。あなたはほとんどこれをやりたいとは決してありません。プライベートな情報を別のクラス(あなたのいたるところで知り合うことができる)に公開するよりも、公共のアクセサ(妥当性をチェックできる)を介して "セミプライベート"データを公開する方がより安全です。
しかし、非常に密接に関連したクラスのペア/グループを持つことがありますが、クラスを別々のクラスにしておくのが理にかなっていますが、世界全体と共有するべきではないデータ。これは「友人」が注意を払って使用できる場所です。
一般に、プライベートデータへの直接アクセスが許可される領域を最小限に抑えるため、フレンドの範囲(フレンドクラスではなくフレンドメソッドなど)を制限してください。できるだけシンプルにしてください。あなたのコードを読んでいる別のプログラマーが、「プライベート」とは、データが本当にプライベートであることを意味するかもしれないと覚えておいてください。また、使用する友人が多いほど、より密接に結びつき、設計を維持するのが難しい傾向にあります。これらは便利なこともありますが、それぞれの用途に適切な正当性があることを確認してください。
'friend'はカプセル化をほとんど同じ感覚で壊しますメンバー機能はそうです! – Nawaz
http://www.parashift.com/c++-faq-lite/friends.html#faq-14.2 –
パブリックアクセサリは危険であり、実装の決定をロックする可能性があります。あるクラスだけが他のクラスの内部を知る必要がある場合は、おそらく 'friend'を使うほうが良いでしょう。友情がカプセル化を破ることはありません。単にカプセルの形状を変えるだけである。 –
友人の必要性はまれです - 一般的に、1つのクラスでいくつかの深い振る舞いを再実装する必要はありません。どちらも、単一のベースから継承したり、多くのアクセサを提供したりせずに書き換えません。
OpenGLベースのレンダラをActiveXで書き直す必要があったのは、低レベルのモデルデータをたくさん用意する必要があったが、(技術的理由以外の理由で)共通のABCを再実装できなかった。
私はクラスB
にクラスAのいくつかのプライベートメンバ変数を公開したかったところ、私はこれがすべてにこれらのメンバーを公開しますので、私は公共のアクセサ関数を追加したくなかった、最近似たような状況がありました他のクラス。
これはB.
へのすべてのプライベートメンバーを公開しますので、私は単にその目的のために別のクラス(ツーBプライベートインターフェイス)を作ったので、私はAの友人b作りたくありませんでした。それはAの友人であり、それは、アクセサ関数を除いては何もしています:
class A
{
int top_secret; // only A has access to it
int secret; // only A and B have access to it
friend struct AToBInterface;
};
struct AToBInterface
{
static int secret(const A& object) {return object.secret;}
};
class B
{
void DoSecretStuff(A& object)
{
int secret = AToBInterface::secret(object);
...
}
};
あなたは構文を微調整することができます(あなたは読み書きアクセスを必要とするなどあれば)、それだけで考えです。私はコード内で1つの場所にしか使用しないので、構文が少し毛深いならば問題はありません。
- 1. MongoDBの友人関係の友人をモデリングする
- 2. 友人関係はC++で継承されていますか?
- 3. rtweetで友人関係を見る/ショー
- 4. Mongodb友人関係を保存する
- 5. 流暢NHibernateと友人の関係
- 6. 友人、友人、友人の友達などのSQLテーブル
- 7. 友人関係をモデリングする安価な方法
- 8. これはshared_ptrの適切な使用ですか?
- 9. これはContTの適切な使用ですか?
- 10. これはMVCの不適切な使用ですか?
- 11. これはHTML5の適切な使用ですか?
- 12. これはmutexの適切な使用ですか?
- 13. SQLAlchemyを使用した適切なデータベース関係の照会
- 14. Rails - 適切な3-wayテーブル関係は何ですか?
- 15. Rails - 適切な関係モデルは何ですか
- 16. データベースはこの2人の友人ですか?
- 17. 特定のテンプレートの友人関係を付与する方法
- 18. グラフ横断:Gremlinを使用して「友人や友人の友人」を質問するには
- 19. ActiveRecordの友人関係をモデル化する方法
- 20. どのように友人を実装する関係とアンドロイド
- 21. UMLのクラス間の友人関係の描写
- 22. 2つのmysqlテーブル間の "友人"の関係
- 23. テンソルフローの適切な使用STFT関数
- 24. facebook apiによる2つのFacebook ID間の関係(友人、友人)を取得
- 25. jqGridとSeo - 友人になることはできますか?
- 26. これはジェネリックスとC#の動的データ型の適切な使用ですか?
- 27. これは、QThreadをQProcessで使用する適切な時期ですか?
- 28. C++適切な使用、このポインタ
- 29. これは論理演算子 "and"の適切な使用ですか?
- 30. これは循環型typedef依存関係を解決する適切な方法ですか?
あなたは本当に自分のuhm ... privatesに触れたいときにクラス "友達"を作る。しかし、実生活と同じように、これは面白くない複雑な状況につながります。このアプローチを開始する場合は注意が必要です。 –
関連:http://www.parashift.com/c++-faq-lite/friends.html –