【发布时间】:2020-10-29 19:48:51
【问题描述】:
这里有一点新的 C++ 开发人员。我有一个类Rational 用于表示有理数并允许用户对它们执行算术和关系运算。我重载了所有运算符并且它们都正常工作,除非我尝试将++/-- 前缀运算符(例如--Rational)或+/- 一元运算符与<< 输出运算符组合在一起,如:
Rational num(7, 2); // initializes rational to 7/2 (fraction)
cout << --num; // should change val to 5/2 (decrements by one)
// error: no match for 'operator<<'(operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'Rational')
或:
Rational num(1, 10);
cout << -num; // should change to -1/10
// error: no match for 'operator<<'(operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'Rational')
我不明白为什么,因为我重载了所有这些运算符以返回 Rational 对象,并且我重载了 << 运算符以接受 Rational 对象。有趣的是,当我尝试这个时:
Rational num(5, 3);
cout << num;
它按预期工作。那么有人可以告诉我这里发生了什么吗?
类的相关代码:
class Rational
{
private:
// Instance variables declarations
int numerator, denominator;
public:
// Constructors declarations
Rational(int numer_val, int denom_val = 1);
Rational();
// Unary operators declarations
friend Rational operator +(const Rational &num);
friend Rational operator -(const Rational &num);
friend Rational operator ++(Rational &num);
friend Rational operator --(Rational &num);
// I/O operators
friend ostream& operator <<(ostream &outs, Rational &num);
};
// Constructors definitions
Rational::Rational(int numer_val, int denom_val) : numerator(numer_val)
{
set_denominator(denom_val); // irrelevant
simplify(); // irrelevant
}
Rational::Rational() : Rational(0) { }
// Unary operators definitions
Rational operator +(const Rational &num)
{
return Rational(+num.numerator, num.denominator);
}
Rational operator -(const Rational &num)
{
return Rational(-num.numerator, num.denominator);
}
Rational operator ++(Rational &num)
{
num.numerator += num.denominator;
return num;
}
Rational operator --(Rational &num)
{
num.numerator -= num.denominator;
return num;
}
// I/O operators
ostream& operator <<(ostream &outs, Rational &num)
{
outs << to_string(num.numerator) + "/" + to_string(num.denominator);
return outs;
}
【问题讨论】:
-
ostream& operator <<(ostream &outs, Rational &num)->ostream& operator <<(ostream &outs, const Rational &num) -
比你想象的还要糟糕:你的操作符重载改变了操作符的语义。例如,前缀递增和递减运算符应该返回对修改对象的引用,而不是对象的副本。这是通过向对象返回一个 reference 来完成的。
标签: c++ operator-overloading overloading