3

誰かが任意の数の値を入力できるように、「>>」演算子をオーバーロードしようとしています。

これは、私が取り組んでいる課題からの要件の逐語です。

Operator>> は、次の形式の入力を期待する必要があります: d v1 v2 … vd 。ここで、d はベクトルの次元であり、各 vi はベクトル内のインデックス i に対応する値です。

最初の値は配列のサイズ (オブジェクト Vex に含まれる) で、残りは要素になると思います。だから彼らが入力した場合

Vex vX;
4, 1, 2, 3, 4 >> vX; 

vX は、1 ~ 4 の数値を含むサイズ 4 の動的配列を作成します。

私がハングアップしている主な部分は、可変数の引数があるため、>> オーバーロードをどのようにプログラムするかです。

理想的には、...の影響に対する解決策があります(これは単なる例です):

std::istream& Vex::operator>>(istream& is, const Vex&){
   /*
     Assume int * data has been previously declared in constructor
     data = new int[iterator[0]]
     create iterator of input for istream
     For n from 1 to iterator[0]...
         data[n] = iterator[n] 
   */
}

私はそれを行う方法を正確に知りません。私は周りを見回しており、istream_iterator を見つけましたが、必要な方法で誰かがそれを使用している良い例を見つけることができません。

私が提供した情報が質問に答えるのに十分であることを願っています. そうでない場合はお知らせください。

どうぞよろしくお願いいたします。

4

4 に答える 4

9

operator>>教師は、可変引数リストを取得するためにオーバーロードするように求めていません。彼は、ユーザー (またはファイル、または任意のオブジェクト)operator>>によって指定された、実行時に可変長の入力を解析するような方法でオーバーロードするように求めています。istream必要な署名は次のとおりです。

std::istream& operator>>(istream& is, Vex& v)

メンバー関数であってはなりませんが、フレンドになるために必要になる場合があります。

私はこのクラスについて何も知らないVexので、関数の書き方を教えることはできませんが、次のようになります。

read an integer N from the stream
set size of Vex object as N, however that's done
for i = 1 to N
    read number X from the stream
    store X in Vex object at position i
于 2013-09-23T02:06:32.457 に答える
0

コンマは演算子であることに注意してください。各式を評価し、右側のオペランドの値を返します。また、左から右に関連付けます。最後に、>>よりも優先順位が高くなり,ます。この意味は

4, 1, 2, 3, 4 >> vX;

と同等です

((((4, 1), 2), 3), (4 >> vX));

しかし4, 1に評価される1ので、上記は に評価されます

(((1, 2), 3), (4 >> vX));

に評価される

((2, 3), (4 >> vX));

に評価される

(3, (4 >> vX));

に評価される

4 >> vX;

したがって、上記のステートメントをコンパイルするには、オーバーロードする必要があります

Vex& operator>>(int, Vex&);

コメントからあなたの元の質問まで、教授はあなたにクラスの過負荷operator>>を求めてVexいるようです. これは、署名が次のようになることを意味します。

istream& operator>>(istream&, Vex&);
于 2013-09-23T02:04:46.177 に答える
0

引数リストはコンマで区切る必要があり、1 回のoperator<<呼び出しで複数の引数を渡すことができます。

OpenCV はこれを行います。使用方法は次のとおりです (コンマ区切りを検索): http://docs.opencv.org/modules/core/doc/basic_structures.html?highlight=comma-separated#mat

ここのコードを見てcv::Mat_ください: https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core/matx.hpp行 840

それは補助オブジェクトを使用します。あなたの仕事はそれがどのように機能するかを見つけることです。

于 2013-09-23T01:47:58.690 に答える
0

あなたはそれを考えすぎています。仕様をもっと注意深く読んでください。以下は、質問されている内容にかなり近いと思います。

GCC 4.7.3: g++ -Wall -Wextra -std=c++0x

#include <vector>
#include <iostream>
#include <string>
#include <sstream>

template <class T>
struct Vex {
  std::vector<T> v;
};

template <class T>
std::istream& operator>>(std::istream& is, Vex<T>& vex) {
  auto dim = 0;
  is >> dim;
  for (auto i = 0; i < dim; ++i) {
    T t;
    is >> t;
    vex.v.push_back(t);
  }
  return is;
}

int main() {
  std::stringstream is("4 1 2 3 4");
  Vex<int> vex;
  is >> vex;

  for (auto i : vex.v) {
    std::cout << i << " ";
  }

  return 0;
}
于 2013-09-23T02:10:39.157 に答える