我对运算符重载有点问题。我有两节课。
#include <iostream>
using namespace std;
class Meter; //Forward declaration
class Inch{
private:
double inches;
public:
Inch() : inches(0) {}
Inch(double i) { inches=i; }
friend Inch operator+ (const Meter& m, const Inch& i);
void out(){ cout << "Inch:" << inches << "\n"; }
double getInches() const { return inches; }
};
和
class Meter{
private:
double meter;
public:
Meter() : meter(0) {}
Meter(double m) { meter=m; }
Meter operator+ (const Inch& i) { return Meter(meter + i.getInches() * 0.0254); }
void out(){ cout << "Meter:" << meter; }
double getMeter() const { return meter; }
};
Inch operator+ (const Meter& m, const Inch& i)
{ return Inch(m.getMeter()/0.0254 + i.getInches()); }
主要是我有这些课程中的一个。我需要将它们与顺序一起添加:m + i;
所以m必须是第一个对象。为了做到这一点,我使用了友元函数,以便使用两个对象作为参数。
Inch i(6.4), resultInch;
Meter m(14), resultMeter;
i.out();
m.out();
resultMeter = m + i;
resultMeter.out();
resultInch = m + i;
resultInch.out();
通过上面的说明,resultMeter
保存了正确的值,但是当我把resultInch
编译器给出“错误与bla bla bla不匹配”时。
我错过了什么?
答案 0 :(得分:7)
问题是这两个运算符都是代码中完全相同+
的重载。您可以在同一个程序中使用其中一个,但不能同时使用两个。
Inch operator+ (const Meter& m, const Inch& i);
class Meter{
Meter operator+ (const Inch& i);
};
如果您有一个Meter m;
和Inch i;
,并尝试使用m + i
添加它们,应该调用哪个运算符实现会发生什么?
答案 1 :(得分:3)
C ++不能在返回值上重载。所以,当你想要说:
meters = meters + inches;
和
inches = meters + inches;
两个meters + inches
都是相同的功能。我建议使用单位属性和转换函数编写一个长度类。但缺乏这一点,我建议你在两个长度类之间编写转换运算符。然后只需要一个加法函数(你仍然应该写两个:meters + meters
和inches + inches
)并且类型可以来回转换。
答案 2 :(得分:1)
从两个类中删除operator +。创建将用作添加结果的代理类:
class ProxyMeterInch
{
private:
double op1, op2;
public:
friend ProxyMeterInch operator+(Meter m, Inch i)
{
ProxyMeterInch r;
r.op1 = m.getMeter();
r.op2 = i.getInch() * 0.0254; // I tend to keep it in meters as I am European
return(r);
}
operator Meter() const
{
return(op1 + op2);
}
operator Inch() const
{
return((op1 + op2) / 0.0254);
}
};
你明白了。根据您尝试分配给正确转换运算符的类型,将选择。
答案 3 :(得分:0)
好的,所以我认为是
Inch resultInch = m + i; // not Meter resultInch (...)
相当于:
Inch resultInch = (Meter)m.operator+(i);
,您无法在Meter
和Inch
之间进行转换。
尝试将其更改为Inch resultInch = i + m;
。