помогите перегрузить << и >> для отображения двух значений

StackOverflow https://stackoverflow.com/questions/1811358

  •  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 указатель, поэтому операторная функция должна принимать только один аргумент.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top