这是我在网站上找到的代码,我正在学习C ++。我不知道如何调试程序,所以我无法弄清楚问题是什么。
#include <iostream>
using namespace std;
class Complex
{
int real;
int img;
public:
Complex()
{
real = 0;
img = 0;
}
Complex(int r, int i)
{
real = r;
img = i;
}
Complex& operator++();
Complex operator++(int);
friend Complex operator+(Complex &a, Complex &b);
friend ostream& operator<<(ostream &out, Complex &a);
friend istream& operator>>(istream &in, Complex &a);
void display()
{
using namespace std;
cout << real << " + " << img << endl;
}
};
Complex& Complex::operator++()
{
++real;
++img;
return *this;
}
Complex Complex::operator++(int)
{
Complex temp(*this);
++(*this);
return temp;
}
Complex operator+(Complex &a, Complex &b)
{
int x = a.real + b.real;
int y = a.img + b.img;
return Complex(x, y);
}
ostream& operator<<(ostream &out, Complex &a)
{
using namespace std;
out << a.real << " + " << a.img << endl;
return out;
}
istream& operator>>(istream &in, Complex &a)
{
using namespace std;
cout << "Enter the real part" << endl;
in >> a.real;
cout << "Enter the imaginary part" << endl;
in >> a.img;
return in;
}
int main()
{
Complex a;
cin >> a;
Complex b(11,8);
cout << "a is :" << a << endl;
cout << "b is :" << b << endl;
Complex c = Complex(a + b);
cout << "c is :" << c << endl;
cout << c;
cout << c++;
cout << c;
cout << ++c;
cout << c;
}
编译器从我尝试在main()内部增加Complex实例的行中给出错误。据我所知,一切都很正确,但Code :: Blocks会出现这些错误:
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'|
error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Complex]|
现在这让我相信(重载)I / O运算符有一些特殊规则应该遵循以便与(重载)递增/递减运算符一起使用。
这是真的,或者我没有抓到的代码中有什么问题?我是这个领域的初学者。
重载输出/输入运算符和递增(post,pre)/递减运算符是否有一些额外的规则可以一起使用它们?
P.S。:原谅我的英语不好......谢谢
答案 0 :(得分:1)
我没有得到与您相同的错误,但这些肯定是个问题:
ostream& operator<<(ostream &out, Complex &a);
Complex operator++(int);
cout << c++;
您已声明operator<<
通过引用到非const获取其Complex
参数,然后尝试将临时绑定到该引用。临时工具不能绑定到非const引用。
对此的简单修复是声明您的运算符通过引用到const获取a
,以便rvalues可以绑定到它:
ostream& operator<<(ostream &out, const Complex &a);
答案 1 :(得分:1)
问题是在输出操作符函数中使用非常量引用。这个问题是当你使用后缀增量运算符(c++
)时,operator++
函数按值返回一个新的Complex
对象,这个对象是临时的,并且您不能将非const引用绑定到临时对象。
简单修复:将参数更改为const引用:
ostream& operator<<(ostream &out, const Complex &a) { ... }
答案 2 :(得分:0)
在输出运算符重载函数中使参数“Complex&amp; a”成为const(例如const Complex&amp; a)。