0

我对运算符重载有一点问题。我有两节课。

#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 不匹配”。

我错过了什么?

4

4 回答 4

7

问题是这两个运算符都是+代码中完全相同的重载。您可以在同一个程序中使用一个或另一个,但不能同时使用。

Inch operator+ (const Meter& m, const Inch& i);
class Meter{
   Meter operator+ (const Inch& i);
};

考虑一下如果你有一个Meter m;并且Inch i;你尝试用 来添加它们会发生什么m + i,应该调用哪个操作符实现?

于 2013-02-25T19:22:46.473 回答
3

C++ 不能重载返回值。所以当你想能够说:

meters = meters + inches;

inches = meters + inches;

两者meters + inches都是相同的功能。我支持编写一个具有单位属性和转换函数的长度类的建议。但缺少这一点,我建议您在两个长度类之间编写转换运算符。然后只需要一个加法函数(你仍然应该写两个:meters + metersinches + inches),类型可以来回转换。

于 2013-02-25T19:39:27.653 回答
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);
    }
};

你明白了。根据您尝试分配给正确转换运算符的类型,将被选中。

于 2013-02-25T20:11:50.483 回答
0

好的,所以我假设它是

Inch resultInch = m + i; // not Meter resultInch (...)

它相当于:

Inch resultInch = (Meter)m.operator+(i);

并且您无法在 和 之间进行Meter转换Inch

尝试将其更改为Inch resultInch = i + m;.

于 2013-02-25T19:39:00.753 回答