Проблема с перегрузкой оператора ввода в С ++ - PullRequest
0 голосов
/ 03 ноября 2019

Я недавно начал изучать C ++ и столкнулся с этой проблемой, используя перегруженный оператор ввода >>.

Я пишу класс для описания комплексного числа. Моя проблема: если я поместил свой main () в Complex.cpp, моя программа работает нормально. Но если я создаю новый файл main.cpp и помещаю туда свой main (), я сталкиваюсь с ошибкой.

ошибка: недопустимые операнды для двоичного выражения ('std :: istream' (также известный как basic_istream ')) и 'Complex')

функция-кандидат недопустима: нет известного преобразования из 'std :: istream' (он же 'basic_istream') в 'std :: istream *' (он же 'basic_istream *') для первогоаргумент;примите адрес аргумента с &

(ниже приведено гораздо больше ошибок, но они указывают на istream, поэтому я не думаю, что это проблема)

Это мойзаголовочный файл:

#include <iostream>

using namespace std;

#ifndef HEADER_H
#define HEADER_H

#endif // HEADER_H

class Complex
{
public:
    double _real;
    double _imag;

public:
    Complex(double, double);
    double getReal() const;
    double getImag() const;
    void setReal(double);

public:
    Complex operator=(const Complex&);
    Complex * operator+(const Complex&);
    Complex * operator+(const double&);
    friend Complex * operator+(const double&, const Complex&);
    Complex * operator++();
    Complex * operator++(int);
    Complex * operator--();
    Complex * operator--(int);
    operator double() const;
    friend ostream &operator<<(ostream*, const Complex&);
    friend istream &operator>>(istream*, Complex&);
};

И я создал Complex.cpp, чтобы определить функцию:

#include "Complex.h"

using namespace std;

Complex::Complex(double a, double b)
{
    this->_real = a;
    this->_imag = b;
}

double Complex::getReal() const{...}

void Complex::setReal(double x){...}

double Complex::getImag() const{...}

Complex Complex::operator=(const Complex& other){...}

Complex * Complex::operator+(const Complex& other){...}

Complex * Complex::operator+(const double &other){...}

Complex * operator+(const double &first, const Complex &second){...}

Complex * Complex::operator++(){...}

Complex * Complex::operator++(int){...}

Complex * Complex::operator--(){...}

Complex * Complex::operator--(int){...}

Complex::operator double() const{...}

ostream &operator<<(ostream &output, const Complex &comp)
{
    output << comp._real << " + " << comp._imag << "i";
    return output;
}

istream &operator>>(istream &input, Complex &comp)
{
    input >> comp._real >> comp._imag;
    return input;
}

Это мой главный:

#include "Complex.h"

int main()
{
    Complex com4(0,0);
    cout << "Input Complex: ";
    cin >> com4;
    cout << com4 <<endl;
}

1 Ответ

0 голосов
/ 03 ноября 2019

Вы объявили операторы io с указателями (что неверно)

friend ostream &operator<<(ostream*, const Complex&);
friend istream &operator>>(istream*, Complex&);

, но правильно реализовали их со ссылками.

friend ostream &operator<<(ostream&, const Complex&) {...}
friend istream &operator>>(istream&, Complex&) {...}

Когда у вас есть main() в Complex.cpp, компилятор может видеть эти правильные реализации (которые не определены ни в одном заголовке).

Если у вас есть main() где-то еще, компилятор может видеть только объявления в заголовке, которые имеют неправильную подпись.

Решением будет исправление объявлений operator<< и operator>> в заголовке, чтобы они соответствовали реализации.


В качестве примечания и, как уже упоминалось вкомментарии: Ваши другие операторские перегрузки должны возвращать Complex & или Complex , а не Complex *. Взгляните на std :: complex или на этой странице, подробно описывая перегрузку операторов , чтобы увидеть, как выглядят канонические реализации.
...