помочь перегрузку << и >> для отображения двух значений - PullRequest
0 голосов
/ 28 ноября 2009

Это может быть вопрос новичка, но я не могу понять это, изучая книгу, которая у меня есть. Конструктор класса инициализирует два типа double, и я хочу, чтобы следующий код вывел эти два типа double с помощью <<. </p>

Complex x( 3.3, 1.1 );

cout << "x: " << x;

После этого мне нужно перегрузить >>, чтобы принять два двойных в них. Это мой первый вопрос здесь, поэтому, если моя информация не предоставлена, сообщите мне

EDIT: Теперь у меня есть для конструктора и оператора перегрузки это:

#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 = Complex (r, i);" но я не уверен, как это сделать. Также я скажу здесь, что речь идет не о классе Complex библиотеки std, хотя он основан на той же идее. Пока что всем очень помогли, но у меня сегодня случай тупого.

1 Ответ

2 голосов
/ 28 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...