0

唯一のメンバーがベクトルであるクラスのオーバーロードされたストリーム挿入演算子を作成しようとしています。Pointこれは、struct2 つの を含むのベクトルですdouble。私が望むのは、ユーザー入力 (一連のdoubles) をストリームに挿入し、それを修飾子メソッドに送信することだと考えています。次のような他のストリーム挿入の例に取り組んでいます。

std::ostream& operator<< (std::ostream& o, Fred const& fred)
 {
   return o << fred.i_;
 }

しかし、私が似たようなことをしようとすると:

 istream & operator >> (istream &inStream, Polygon &vertStr)
     {
        inStream >> ws;
        inStream >> vertStr.vertices;
        return inStream;
     }

「一致しないoperator >>など」というエラーが表示されます。を省略して.verticesもコンパイルされますが、それは正しくないと思います。(ちなみに、verticesは私の名前ですvector <Point>。)そして、それが正しいとしても、プログラムでそれを使用するためにどの構文を使用すればよいか実際にはわかりません。のように見える必要があります。

これが私のPolygonクラスです:

//header

#ifndef POLYGON_H
#define POLYGON_H
#include "Segment.h"
#include <vector>
class Polygon
{
 friend std::istream & operator >> (std::istream &inStream, Polygon &vertStr);
 public:
   //Constructor
    Polygon(const Point &theVerts);
    //Default Constructor
    Polygon();
    //Copy Constructor
    Polygon(const Polygon &polyCopy);
    //Accessor/Modifier methods
    inline std::vector<Point> getVector() const {return vertices;}
    //Return number of Vector elements
    inline int sizeOfVect() const {return (int) vertices.capacity();}
    //add Point elements to vector
    inline void setVertices(const Point &theVerts){vertices.push_back (theVerts);}

 private:
   std::vector<Point> vertices;
};
#endif

//Body

using namespace std;
 #include "Polygon.h"
// Constructor
Polygon::Polygon(const Point &theVerts)
    {
        vertices.push_back (theVerts);
        }
//Copy Constructor
Polygon::Polygon(const Polygon &polyCopy)
{
    vertices = polyCopy.vertices;
}
//Default Constructor
Polygon::Polygon(){}

istream & operator >> (istream &inStream, Polygon &vertStr)
 {
    inStream >> ws;
    inStream >> vertStr;
    return inStream;
 }

あいまいで申し訳ありません。ある講師が、ストリーム挿入の簡単な例を示してくれました。

4

1 に答える 1

1

問題は、ベクトルの標準的な抽出演算子がないことです(ストリームへの挿入、ストリームからの抽出)。そのため、独自の演算子を定義する必要があります。また、ストリームはデフォルトで空白をスキップするため、通常はを使用する必要はありませんstd::ws。ベクトル入力の終了方法を定義しなかったので、改行がベクトルの終わりを示していると仮定します。

これは学校の問題なので、あまりあげることはできません。まず、記入する必要のある宣言と、役立つ可能性のあるインクルードをいくつか示します。名前空間をインポートするのは悪い形式なstdので、以下はインポートしません。

#include <list>

// returns true if ch is a horizontal space. Locales are a little tricky,
// so you could skip them for now and instead start with the functions defined 
// in header <ctype>
bool ishs(char ch, std::locale loc=std::locale::global());
// return true if ch is a vertical space
bool isvs(char ch);
// return true if the next character in stream 'in' is a vertical space.
bool eol(std::istream& in);

// reads & discards horizontal spaces
std::istream& hs(std::istream& in);

class Point {
public:
  // Scalar is so you can use 'Point::Scalar' rather than 'double', 
  // making it easy should you which to change the type that a Point holds.
  // When you've covered templates, this will make it trivial to templatize Point.
  typedef double Scalar;
  ...
};

class Polygon {
public:
     // adds pt as the last of this polygon's vertices
     // Note: this is basically your "setVertices" with a different name
   Polygon& append(const Point& pt);
     // adds the points from 'start' to 'end' to this polygon
   template <typename _Iter>
   Polygon& append(_Iter start, _Iter end);
     // remove all points in this polygon
   void erase();
     // returns the number of sides on this polygon, 
     // which is also the number of vertices
     // Note: this is different from your "sizeOfVect"; see below for more
   int sides() const { return vertices.size(); }
     // set aside space for polygon to have 's' sides.
   voids sides(int s) { vertices.resize(s); }
}

/* reads the next two numbers on the current line into pt.
   Throws an exception if there is only one number.
 */
std::istream& operator>>(std::istream& in, Point& pt);
/* reads numbers on the current line into points on 'poly'.
   Throws an exception if there is only one number. Preferably,
   won't alter 'poly' if there are an odd amount of numbers.

   you could also put the contents of this operator into >>(istream&, Polygon&)
 */
std::istream& operator>>(std::istream& in, std::vector<Point>& vertices) {
    std::list<Point::Scalar> points;
    Point pt;
    // while not at eol(in), read into pt and add it to points
    // After that, empty vertices, then add the Points in points to vertices
    ...
}

文字関連の関数(、、、、)の代わりにishs、次isvsの行を文字列に読み取り、そこからポイントを読み取り、そこからポイントを読み取ることができます。ベクトルは、に達すると終了します(またはfalse)。hseolgetlineistringstreamistringstreameofstrin >> pt

あなたがする必要があるのは、タスクoperator>>(istream&, vector<Point>&)をメソッドと関数の呼び出しに変換することです。

  1. 新しいメソッドと関数を宣言します。
  2. タスクの説明を書きます(>>コメントで行われているように)。
  3. 説明をメソッドと関数の呼び出しに変換します。
  4. 書き込む新しいメソッドまたは関数がなくなるまで繰り返します。

myPolygon::sides()がyourと異なる理由:サイズを変更せずにベクトルが保持できる要素の数Polygon::sizeOfVect()を返すことに注意してください。vector::capacityつまり、基本的にはsizeof(vect)/ typeof(element)です。vector::sizeベクトルに現在格納されている要素の数です。のように要素にスペースを事前に割り当てる場合Polygon::sides(int)、または要素を背面からポップする場合、この2つは異なる場合があります。ただし、何があってもvector::capacityvector::size

于 2010-04-03T04:56:06.670 に答える