Я считаю, что проблема с вашим operator >>
заключается в том, что вы используете те измерения, которые уже есть в Matrix
, а не пытаетесь восстановить измерения из найденного вами ввода.
Я думаю, что лучше всего было бы сделать так, чтобы реализация operator <<
предшествовала матрице с информацией о размерах (например, числом строк и столбцов), а затем читала в этой информации функцию operator >>
.Например:
ostream &operator<<(ostream &out, const Matrix &m)
{
out << m.dx << ' ' << out.dy << '\n';
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
out << m.p[i][j] << " ";
out << endl;
}
return out;
}
Имея это в виду, вы можете написать свой оператор извлечения потока как
istream &operator>>(istream &in, Matrix &m)
{
in >> m.dx >> m.dy;
/* Some sort of logic to ensure that you've allocated an array large enough to
* hold all the elements ...
*/
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
in >> m.p[i][j];
}
return in;
}
Это может быть не самый эстетически приятный оператор ввода и вывода, но они должныВыполни работу.
Если вы хотите сделать эти операторы немного более классифицированными, рассмотрите возможность вывода элементов матрицы с использованием какого-либо специального символа для разделения строк и столбцов.Например, вы можете попытаться вывести матрицу
0 1 2
3 4 5
6 7 8
как
[[0 1 2][3 4 5][6 7 8]]
При такой настройке информация о размере матрицы неявно указывается в том, как работает группировка скобок.Опять же, это может усложнить чтение входных данных, поскольку вы не знаете заранее, насколько велика матрица.Но в целом вам будет проще всего.
Как к сведению, вы, вероятно, не захотите использовать endl
для разграничения строк при написании оператора вставки потока.В дополнение к написанию новой строки, endl
очищает буфер.Если ваш поток подключен к сетевому соединению, вы, возможно, не захотите продолжать очищать буфер всякий раз, когда у вас будет новая строка матрицы, так как это может привести к тому, что большая часть данных будет отправляться пакетными (медленными), а не группировать их.все вместе сразу (быстро).
Надеюсь, это поможет!