回答:
フレンドは、クラスのインターフェースを拡張する古典的な方法です。
しかし、すばらしいのは、特定のアイテムをクラスに緊密にバインドするという意図を友人が明示的に文書化することです。
注:友達を使用すると、友達をクラスに緊密にバインドできます。
完璧な例は、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クラスの実装を変更するには、ストリーム演算子の実装を変更する必要があります)。しかし、これは期待されています。パブリックインターフェイスのすべての部分(パブリック/保護されたメソッドを含む)は、実装に密接にバインドされています。
しかし、注意:クラス宣言の一部としてこのバインディングを明示的に文書化しました。
注:プライベートデータを公開するための好ましい方法として友人を言及することはありません。友人の使いすぎは、実装を公開するのと同じくらい悪いことがあります。すべての言語機能と同様に、慎重に使用する必要があります。
friend
好まれたのかを尋ねる場合、外部からプライベートクラスデータにアクセスするために通常使用する他の方法は何ですか?