2017-04-17 20 views
0

私はEOFまで、ユーザーからの入力を読み込み、書店のプログラムを作成しようとしているのオーバーロード。それを行うために、私はistream >> operatorをとりわけオーバーロードしました。参照-渡されたポインタ

class CSales { 
public: 
    //constructors 

    friend ostream & operator << (ostream &os, const CSales &x) const; 
    friend istream & operator >> (istream &is, const CSales &x); 

    //m_vars 
}; 
istream & operator >> (istream &is, const CSales &x) { 
    /* following line prints error: 
    * no match for 'operator>>' */ 
    if (is >> x.m_isbn >> x.m_price >> x.m_count) { 
     x.m_revenue = x.m_count*x.m_price; //assignment of member is read-only object 
    } 

    return is; 
} 

int main() { 
    vector<CSales*> dbs1; 
    CSales *candidate = new CSales(); 

    while (cin >> *candidate) { 
     //sorted by isbn 
     auto iter = lower_bound(dbs1.begin(), dbs1.end(), candidate, cmp_isbn); 
     //operations 

    return 0; 
} 
  1. 私は、参照を使用してポインタを渡すためにしようとしているので、過負荷が動作していないという疑いを持っています。私はその前提で正しいのでしょうか?

  2. 私がそれを理解したように、const CSales xは私が指しているオブジェクトではなくポインタを変更するので間違っています。だから、おそらくどちらかconst CSales &*xまたはconst CSales *&xのいずれかで私を残します。これら2つの違いは何ですか?

  3. x.m_revenue行が機能しない理由がわかりません。私はconstという演算子を持っていないと、なぜ読み取り専用になりますか?

FULL CODE

EDIT:それはより効率的に(のみ移動ポインタではなく、オブジェクト自体)をソートするべきであるので、私はオブジェクトへのポインタのベクトルを使用しています。ここで

+0

注意。したがって、出力演算子に 'const'指定子を付けることはできません。それはあなたにビルドエラーを与えるでしょう。 –

+0

あなたのエラーについては、入力演算子*がオブジェクト 'x'を変更します。私。 'const'にすることはできません。 –

+0

私の 'ostream'は' const'を持ってはいけないが、 'istream'に' const'はありません。 –

答えて

1

は問題です:

istream & operator >> (istream &is, const CSales &x) { 
//         ^^^^^ 

これはxはあなたがxを変更しないことを、定数でコンパイラに指示します。しかし、それは入力演算子なので、確かにxを変更するか、あまり意味がないでしょう。

エラーメッセージ「読み取り専用オブジェクトのメンバの割り当ては、」問題について非常に明確なヒントされている必要があります。

ポインタの問題の疑いは赤いニシンです(ただし、ではなく、ポインタを使用することをお勧めします。現代のC++のポインタは多態性を超えて必要ではないことがよくあります)。


そして、私の最初のコメント明確にする:

class CSales { 
public: 
    ... 
    friend ostream & operator << (ostream &os, const CSales &x) const; 
    //               ^^^^^ 
    ... 
}; 

operator<<機能が非会員機能なので、const修飾子を追加すると、エラーを構築するために導くべきです。メンバー関数はconstの資格を持つことができます。入出力演算子は `CSales`クラスのスコープ内で宣言されているが、それらは*ない*メンバ関数であること

+0

私は議論を逃した、今それは理にかなっている。ありがとうございました。好奇心が強い、私の質問2に仮想的なシナリオで対処するのに十分親切になるでしょうか? –

+0

@HichigayaHachiman私はあなたがそれが何を意味するかは分かりませんが、 'CSales&* x'は' x'が参照へのポインタであることを意味します。これは意味をなさないので動作しません。 'CSales *&x'は、ポインタを変更したい場合に意味をなすポインタへの参照です。 –

+0

それは私が知りたかったことです、ありがとう、 –

関連する問題