помогите перегрузить << и >> для отображения двух значений
-
06-07-2019 - |
Вопрос
Возможно, это вопрос для новичка, но я не могу понять его, просматривая имеющуюся у меня книгу.Конструктор класса инициализирует два двойных значения, и я хочу, чтобы следующий код выводил эти два двойных значения с помощью <<.
Complex x( 3.3, 1.1 );
cout << "x: " << x;
После этого мне нужно перегрузить >>, чтобы принять в них два дубля.Это мой первый вопрос здесь, поэтому, если предоставленная мной информация недостаточна, сообщите мне.
РЕДАКТИРОВАТЬ:Теперь у меня есть оператор конструктора и перегрузки:
#include "Complex.h"
Complex::Complex( double realPart, double imaginaryPart )
: real( realPart ),
imaginary( imaginaryPart )
{
}
std::istream& operator>>(std::istream& strm, const Complex &c)
{
double r,i;
strm >> r >> i;
c = Complex(r,i);
return strm;
}
Я знаю, что должен изменить «Const Complex & C» и «C = комплекс (R, I);»; Но я не уверен, как это сделать.Также здесь скажу, что речь идет не о классе Complex из библиотеки std, хотя он основан на той же идее.До сих пор все мне очень помогали, но сегодня у меня тупой случай.
Решение
оператор<< :
std::cout
является std::ostream
объект, поэтому вам придется перегрузить operator<<
для ostream
, что занимает std::complex<double>
в качестве аргумента, предполагая, что вы используете std::complex<double>
из стандартного комплекса заголовков.Поскольку вам не следует вносить внутренние изменения в стандартные контейнеры и классы, сделайте их автономными.
#include <iostream>
#include <complex>
std::ostream& operator<<(std::ostream& strm, const std::complex<double>& c)
{
strm << "real: " << c.real() << "imag: " << c.imag();
return strm;
}
оператор>> :
operator>>
берет std::istream
объект, который делает противоположное тому, что std::ostream
делает.Если вы используете потоки для такой сериализации, рекомендуется включить для них исключения.Обычно вам нужно только надеть std::ios::badbit
.
#include <iostream>
#include <complex>
std::istream& operator>>(std::istream& strm, std::complex<double>& c)
{
double r,i;
strm >> r >> i;
c = std::complex<double>(r,i);
return strm;
}
Если вам нужен доступ к внутренним членам класса, вы должны определить перегруженную функцию как дружественную.Но поскольку std::complex::real() и std::complex::imag() являются частью публичного интерфейса, здесь это не требуется.А в примере с istream мы просто вызываем конструктор копирования, который также является частью публичного интерфейса.
Я предположил, что вы хотите использовать здесь cin и cout.Но если вы хотите перегрузить операторы для чего-то другого, то же самое применимо.Если вы реализуете операторы внутри определения класса, у вас есть доступ к this
указатель, поэтому операторная функция должна принимать только один аргумент.