「友人」キーワードは何に使用されますか?


11

friendクラスの個人データへのアクセス権を与えるためにキーワードが好まれる理由を説明できますか?


1
なぜfriend好まれたのかを尋ねる場合、外部からプライベートクラスデータにアクセスするために通常使用する他の方法は何ですか?
ベンジャミンバニエ

@honk「優先」は、ここで使用する間違った言葉かもしれません。投稿の大部分を編集して文法とその他を修正し、元の単語の選択を維持しましたが、ここには言葉の壁があると思います。
アダムリア

今日は偶然友人について読んだのでわかりません。記事には、友人を使用しない場合、モノリットクラスを作成します。
ダルトン

回答:


17

フレンドは、クラスのインターフェースを拡張する古典的な方法です。
しかし、すばらしいのは、特定のアイテムをクラスに緊密にバインドするという意図を友人が明示的に文書化することです。

注:友達を使用すると、友達をクラスに緊密にバインドできます。

完璧な例は、C ++のストリーム演算子です。

class Plop
{
    private:
        int  value;
        friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
        friend std::istream& operator>>(std::istream& stream, Plop&       data);
};

std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
     return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop&       data)
{
     return stream >> data.value;
}

ここで、Plopクラスのパブリックインターフェイスを拡張して、オブジェクトをストリームにストリームできるようにしますが、内部実装を公開したり、必要なget / setメソッドの使用を要求して将来の実装の頭痛を引き起こしたりすることはありません内部実装が変更された場合でも(パブリックインターフェイスの一部になるため)維持されます。

注:これはカプセル化を壊しませが、ストリーム演算子をPlopクラスの実装に緊密にバインドします(つまり、Plopクラスの実装を変更するには、ストリーム演算子の実装を変更する必要があります)。しかし、これは期待されています。パブリックインターフェイスのすべての部分(パブリック/保護されたメソッドを含む)は、実装に密接にバインドされています。

しかし、注意:クラス宣言の一部としてこのバインディングを明示的に文書化しました。

注:プライベートデータを公開するための好ましい方法として友人を言及することはありません。友人の使いすぎは、実装を公開するのと同じくらい悪いことがあります。すべての言語機能と同様に、慎重に使用する必要があります。


(getterを介して)データにパブリックにアクセスできる場合、代わりに無料の関数を使用しますか?
イオアナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.