Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符重载-不匹配_C++_Operator Overloading - Fatal编程技术网

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)
a
friend
?它调用公共成员函数
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);
    }
};