1. ホーム
  2. c++

[解決済み] C++で'friend'はいつ使うべきですか?

2022-03-14 13:49:50

質問

を読み進めてきました。 C++のFAQ が気になり friend 宣言があります。私自身は使ったことがないのですが、この言語には興味があります。

を使用する良い例は何ですか? friend ?


FAQをもう少し読んでみると、私は << >> 演算子をオーバーロードして、それらのクラスの友人として追加します。しかし、これがどうしてカプセル化を破らないのか、私にはよくわからない。このような例外が、OOPという厳密性の範囲内に留まることができるのはいつなのでしょうか?

解決方法は?

まず第一に(IMO)、次のような人の言うことを聞いてはいけません。 friend は有用ではありません。有用です。多くの場合、一般に公開されることを意図していないデータや機能を持つオブジェクトがあります。特に、多くの作者がいて、それぞれの分野に表面的にしか精通していないような大規模なコードベースでは、そのようなことが起こり得ます。

friend 指定子に代わるものはありますが、面倒だったり(cpp レベルの具象クラスやマスクされた typedef)、確実でなかったり(コメントや関数名の規則)することがよくあります。

答えに入ります。

friend 指定されたクラスは、フレンドステートメントを作成したクラス内の保護されたデータや機能にアクセスすることができます。例えば、以下のコードでは、誰でも子供に名前を尋ねることができますが、母親と子供だけが名前を変更することができます。

この単純な例をさらに進めて、Windowのような複雑なクラスを考えてみましょう。おそらく Window は多くの関数やデータ要素を持ち、それらは一般にはアクセスできませんが、 WindowManager のような関連するクラスでは必要です。

class Child
{
//Mother class members can access the private parts of class Child.
friend class Mother;

public:

  string name( void );

protected:

  void setName( string newName );
};