C++ 运算符重载-不匹配
我对运算符重载有点问题。我有两节课C++ 运算符重载-不匹配,c++,operator-overloading,C++,Operator Overloading,我对运算符重载有点问题。我有两节课 #include <iostream> using namespace std; class Meter; //Forward declaration class Inch{ private: double inches; public: Inch() : inches(0) {} Inch(double i) { inches=i; }
#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; }
};
根据上面的说明,resultMeter
保存正确的值,但当我输入resultInch
时,编译器给出“错误与bla-bla-bla不匹配”
我遗漏了什么?问题是这两个运算符都是代码中完全相同的
+
的重载。您可以在同一程序中使用其中一个或另一个,但不能同时使用这两个
Inch operator+ (const Meter& m, const Inch& i);
class Meter{
Meter operator+ (const Inch& i);
};
考虑一下如果你有一个Meter m会发生什么代码>和英寸i
然后您尝试用m+i
添加它们,应该调用哪个操作符实现?好的,所以我假设它是
Inch resultInch = m + i; // not Meter resultInch (...)
这相当于:
Inch resultInch = (Meter)m.operator+(i);
您无法在米
和英寸
之间进行转换
尝试将其更改为Inch resultInch=i+m代码>C++无法在返回值时重载。所以当你想说:
meters = meters + inches;
及
两个米+英寸
的功能相同。我支持使用units属性和转换函数编写一个length类的建议。但缺少这些,我建议您在两个长度类之间编写转换运算符。然后只需要一个加法函数(您仍然应该编写两个:meters+meters
和inches+inches
),并且可以来回转换类型。从这两个类中删除操作符+。创建将作为添加结果使用的代理类:
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);
}
};
你明白了。根据您试图分配给正确转换运算符的类型,将选择。创建一个具有成员函数的类,以获取米、英寸和任何其他单位,而不是将不同的类用于Inch
和Meter
。只是我的意见。不,我需要创建不同的类。一些与您的问题无关的事情:两个类的构造函数都采用了double
,可能应该标记为explicit
,也可以使用构造函数初始值设定项列表来初始化成员变量。为什么Inch operator+(const Meter&m,const Inch&i)
afriend
?它调用公共成员函数Meter::operator+
应该是const
成员函数,因为它不修改Meter
对象。所以我需要创建Meter.h和Inch.h吗?@mertmetin:不,不能在同一个程序中提供两个运算符(不是标题,不是翻译,而是程序)。对你来说,增加一米和几英寸的结果是什么?那是一米远吗?一英寸的距离?确定这一点,并实现一个运算符+
,该运算符接受适当的参数并返回正确的类型。@mertmetin:这并不意味着有两个运算符+
,只有单个运算符+
的结果需要同时转换为英寸
和米
@mertmetin:这是由您定义的,而不是由我定义的。我个人会遵循本杰明的建议,米和英寸不是真正的实体,实体是可以用米或英寸来测量的长度。。。。(事实上,我是一个坚定的信仰者,并且认为帝国制度应该被驱逐,如果这是一个答案:)默特梅丁:我可以给你两种或三种方式来编纂你的任务。我觉得你不太明白被问的是什么,直到你明白真正被问的是什么。你应该先解决这个问题。请注意,只向您提供其中一种解决方案要比争论更简单,但这对您没有帮助。对不起,这不是我想要了解的;)。然后告诉我这不是你想要的答案。这是我所知道的最接近于重载返回类型(这是语言本身不支持的),我只需要两个类Inch和Meter。我主要创建2英寸和2米的对象。英寸i(6.4),结果为CH;米(14),结果计;试着使这个结果计=m+i;resultMeter.out();结果ch=m+i;resultInch.out();
meters = meters + inches;
inches = meters + inches;
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);
}
};