C ++でのオーバーロード>>

I want to overload the >> operator in C++ so that my class of vectors can take input in the form [1 2 3 4 5].

例えば:

class A
{
public:
    A()  {} 

    A(const std::vector& source)
      : v_(source)  
    {

    }

   //returns an immutable reference to v_
    const std::vector& get_v() const
    {
       return v_;
    }

   //returns a mutable reference to v_
    std::vector& get_v()
    {
        return v_;
    }
private:
    std::vector v_;
};

int main (){
A my_vector;

while (cin >> my_vector)
  //do some other computations

}

Right now I've declared the overloading function for >> like this:

istream& operator>> (istream & stream, A vector){

}

しかし、私は私の映画の中にあるものを私のAオブジェクトに保存するために次に何をする必要があるのか​​混乱しています。入力の[]を確認して、それが受け入れられていることを確認する必要があると想定します。そうでない場合は、アプリケーションを終了します。助言がありますか

0
@ildjarn:そうだと思います。したがって、 A の代わりに A&vector を使用します。
追加された 著者 Zeenobit,
@ジョン: A として vector を意味しますか?
追加された 著者 ildjarn,
あなたはそれをどこで宣言しましたか?そしてどうやって?
追加された 著者 FailedDev,
Avector&として使用することもできます。
追加された 著者 Jon,
@ildjarn:Errr ...はい。 vector ==パラメータ名&& A ==クラス名はちょっと混乱します:)
追加された 著者 Jon,
なぜ [] が必要なのですか?あなたは 1234> 5
追加された 著者 wkl,
@birryree私はちょうどそれが良い練習になると思って、それをより読みやすくします。たとえ私が[]とやりなおしても、それは私が入力をどのように取ることができるかという問題を残しています。
追加された 著者 cody,

2 答え

最初に必要なのは、2番目の引数を参照渡しで渡すことで、演算子の中で変更されたオブジェクトが、読み込んでいるオブジェクトと同じオブジェクトになるようにします。

次に必要となるのは、入力から内部ベクトルに実際に読み込むことです。そのためには、最初の []をスキップして、] が見つかるまで数字を読みとる必要があります。

最初の文字はcharに読み込むことができます。次に、 copy を使用してベクトルを入力し、もう1つの文字を読み込んで]

std::istream& operator>>( std::istream & stream, A & vector ) {
    char ch;
    stream >> ch; 
    std::copy( std::istream_iterator(stream), std::istream_iterator(),
               std::back_inserter( vector.get_v() ) );
    stream.clear();
    stream >> ch;
    return stream;
}

これはスケッチであり、エラーを処理する必要があります。特に、最初の文字が []でないか、最後の文字が] でない場合はどうなりますか?

サイドノート:

get_v()メソッドのように、内部データへの完全なアクセスを提供することは、通常はお勧めできません。つまり、完全なアクセスを提供するだけの場合は、 v _ を非公開にする必要はありません。アクセス可能にする必要がある場合は公開し、2つのアクセサー関数。

3
追加された

私はperoperlyの質問を理解しているかどうかはわかりませんが、オブジェクトの std :: vectorstd :: cin の要素を入れようとしているようです。これを行うには、 void A :: push(int value)などの値をベクターに挿入する A クラスのメソッドが必要です。あなたのベクトルを公開することはお勧めできません。

次に、オーバーロードされた演算子で、 vector.push を使用して数値をオブジェクトに挿入します。

0
追加された
別のオプションは、関数を friend することです。彼のクラスは vector&get_v()を持っています。
追加された 著者 Mooing Duck,