c++中重载输入运算符的问题

Problem with overloading input operator in c++

本文关键字:问题 运算符 输入 重载 c++      更新时间:2023-10-16

我最近开始学习C++,遇到了使用重载输入运算符的问题>gt;。

我正在写一个描述复数的类。我的问题是:如果我把main((放在Complex.cpp中,我的程序就会正常运行。但如果我创建了一个新的文件main.cpp并将main((放在那里,我就会出错。

错误:二进制表达式("st::istream"(又名"basic_stream"(和"Complex"(的操作数无效

候选函数不可行:第一个参数没有从"std::istream"(又名"basic_stream"(到"std:"istream*(又名"asic_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;
}

您用指针声明了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<<operator>>的声明,使它们与实现匹配。


请注意,正如评论中已经提到的:您的其他操作员重载应该返回Complex &Complex,而不是Complex *。看看std::complex或这个页面,详细介绍运算符重载,看看规范实现是什么样子的。