Принимая вещи в порядок. Во-первых, терминология: operator<<
является оператором вставки - он вставляет элементы в поток. operator>>
- оператор извлечения - он извлекает элементы из потока.
Во-вторых, у вас есть довольно серьезные проблемы в ваших операторах вставки. Давайте начнем с низу, point::operator<<
. Прямо сейчас у вас есть:
friend std::ostream& operator << (std::ostream& stream, Point &p)
{
stream << p.x << p.y;
return stream;
}
Теперь давайте рассмотрим, что произойдет, когда мы добавим к этому вещественные числа, скажем, 1,23 и 4,56. Он выпишет:
1.234.56
Это явно проблема. Из просмотра самих данных невозможно определить, где заканчивается «x» и начинается «y». Нам нужно отформатировать данные, чтобы мы могли различать их:
std::ostream &operator<<(std::ostream &stream, Point const &p) {
return stream << p.x << " " << p.y;
}
Также обратите внимание, что поскольку мы не собираемся изменять пройденную точку, я изменил ее на const
ссылку.
Когда / если вы пытаетесь сохранить более одного многоугольника в файле, вы снова сталкиваетесь с той же проблемой - у вас есть поток вершин, но нет ничего, чтобы показать, какие вершины принадлежат каким полигонам. Например, квадрат, за которым следует треугольник, может выглядеть так:
0 0
1 0
1 1
0 1
1 1
2 2
0 2
Один из очевидных способов справиться с этим - поставить перед каждым многоугольником число вершин, которые он содержит, поэтому одни и те же данные будут выглядеть примерно так:
4
0 0
1 0
1 1
0 1
3
1 1
2 2
0 2
Затем мы можем заново сгенерировать исходные многоугольники, когда будем их читать. Для этого нам (очевидно) необходимо написать наши операторы соответствующим образом:
std::ostream &operator<<(std::ostream &os, Polygon const &p) {
std::vector<Point> v = p.getVector();
os << v.size << "\n";
// write each point out using operator<< for Point:
std::copy(v.begin(), v.end(), std::ostream_iterator<Point>(os, "\n"));
return os;
}
std::istream &operator>>(std::istream &is, Polygon &p) {
size_t size;
is >> size;
Point temp;
for (int i=0; i<size; i++) {
is >> temp;
p.setVertices(temp);
}
return is;
}
Глядя на то, как долго это длится, я думаю, что пока остановлюсь на этом.