【问题标题】:Problem with overloading input operator in c++c++中输入运算符重载的问题
【发布时间】:2019-11-03 09:15:09
【问题描述】:

我最近开始学习 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;
}

【问题讨论】:

  • ostream* -> ostream&amp;, istream* -> istream&amp;
  • 欢迎来到 Stack Overflow!请以tour 开头并阅读How to Ask。对于像您这样的问题,minimal reproducible example 也是强制性的。
  • 呃……这些指针是怎么回事?查看标准复数类,了解方法签名应该是什么。
  • 复杂 * operator++();所有这些代码行都编辑它们。它们应该是 Complex & operator++(); .他们应该返回参考。
  • 感谢@tkausl,我不敢相信我犯了这个错误。这很尴尬

标签: c++ input overloading


【解决方案1】:

你用指针声明了 io 操作符(这是错误的)

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

但是通过引用正确地实现了它。

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

当您在 Complex.cpp 中有 main() 时,编译器可以看到那些正确的实现(未在任何头文件中定义)。

如果您的main() 在其他地方,编译器只能看到标头中的声明,这些声明具有错误的签名。

解决方案是修复标头中operator&lt;&lt;operator&gt;&gt; 的声明,使其与实现匹配。


作为注释并在 cmets 中已经提到:您的其他运算符重载应返回 Complex &amp;Complex not Complex *。查看std::complexthis page, detailing operator overloading 以了解规范实现是什么样的。

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 2012-12-30
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多