[解決済み] operator<<はフレンド関数とメンバ関数のどちらで実装すべきですか?
質問
これは基本的な疑問なのですが、以下のような実装方法があるのでしょうか?
operator<<
?
読み方
これ
みたいなのが見えてくる。
friend bool operator<<(obj const& lhs, obj const& rhs);
は、次のようなものよりも好ましいです。
ostream& operator<<(obj const& rhs);
しかし、なぜどちらかを使わなければならないのか、その理由がよくわからない。
私の個人的なケースは
friend ostream & operator<<(ostream &os, const Paragraph& p) {
return os << p.to_str();
}
でも、たぶんできると思う。
ostream & operator<<(ostream &os) {
return os << paragraph;
}
この判断はどのような根拠に基づいて行えばよいのでしょうか?
備考 :
Paragraph::to_str = (return paragraph)
ここで、段落は文字列です。
解決方法は?
この問題は、あなたの記事の解釈の中にあります。 リンク .
平等性
この記事は、ブール関係の演算子を正しく定義するのに問題がある人についての記事です。
演算子です。
- 等価性 == と !=
- 関係 < > <= >=.
これらの演算子は、同じ型の2つのオブジェクトを比較するため、boolを返す必要があります。通常、これらの演算子はクラスの一部として定義するのが最も簡単です。なぜなら、クラスは自動的にそれ自身の友人となるので、Paragraph型のオブジェクトはお互いに(お互いのプライベートメンバでさえも)調べることができるからです。
メンバ関数では右辺だけが自動変換されますが、自由関数では両辺が同じ型でない場合に自動変換されるため、自由関数にするという議論もあります。私は、これは紙一重の議論だと思います。なぜなら、そもそも自動変換が行われることを望んでいないからです(通常は)。しかし、もしこれが必要なことであれば(私はお勧めしませんが)、コンパレータをフリースタンディングにすることは有利になります。
ストリーミング
ストリーム演算子です。
- 演算子 << 出力
- 演算子 >> 入力
これらをストリーム演算子として使用する場合(バイナリシフトではなく)、最初のパラメータはストリームです。ストリームオブジェクトにはアクセスできないので(つまり、ストリームオブジェクトを変更できない)、これらはメンバ演算子にはなりえず、クラスの外部でなければならない。したがって、クラスの友人であるか、ストリーミングを行うパブリックメソッドにアクセスする必要があります。
また、これらのオブジェクトは、ストリーム・オブジェクトへの参照を返すのが伝統的で、これによりストリーム操作を連鎖させることができます。
#include <iostream>
class Paragraph
{
public:
explicit Paragraph(std::string const& init)
:m_para(init)
{}
std::string const& to_str() const
{
return m_para;
}
bool operator==(Paragraph const& rhs) const
{
return m_para == rhs.m_para;
}
bool operator!=(Paragraph const& rhs) const
{
// Define != operator in terms of the == operator
return !(this->operator==(rhs));
}
bool operator<(Paragraph const& rhs) const
{
return m_para < rhs.m_para;
}
private:
friend std::ostream & operator<<(std::ostream &os, const Paragraph& p);
std::string m_para;
};
std::ostream & operator<<(std::ostream &os, const Paragraph& p)
{
return os << p.to_str();
}
int main()
{
Paragraph p("Plop");
Paragraph q(p);
std::cout << p << std::endl << (p == q) << std::endl;
}
関連
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)