【问题标题】:How to use both member function and friend function operator overloading in same class如何在同一个类中同时使用成员函数和友元函数运算符重载
【发布时间】:2021-07-11 02:51:29
【问题描述】:

根据作业要求,

我正在尝试实现前缀 ++ 和后缀 ++ 运算符重载作为同一个类中的成员函数和友元函数。

class dist {
private:
    int kMeter;
    int meter;
public:
    // postfix
    dist operator++(int unused) {
        dist dd = *this; 
        (this -> meter)++;
        return dd;
    }

    // prefix
    dist operator++() {
        ++(this -> meter);
        return *this;
    }

    dist(int k = 0, int m = 0) {
        kMeter = k;
        meter = m;
    }

    void print();
    int getMeter() const { return meter; }
    int getKMeter() const { return kMeter; }

    friend dist operator++(dist& d, int unused); //postfix
    friend dist operator++(dist& d); // prefix
};

dist operator++(dist& d, int unused) { // postfix friend func
    dist dd = d; // copy the old value into dd
    d.meter++;
    return dd; // return the original value of d
}

dist operator++(dist& d) { // friend prefix ++
    ++d.meter;
    return d; // return the final value of d
}

但是当我尝试使用前缀 ++ 或后缀 ++ 重载时,它会显示模棱两可的错误。

dist d2(1, 900);
dist d3(3, 800);

/// these following lines showing ambiguous error
cout << d2++ << endl;
cout << ++d3 << endl;

现在,

如何在同一个类文件中为同一个运算符使用两种类型的运算符重载而不会出现任何错误。

【问题讨论】:

  • 为什么你想要两个不同的函数来做同样的事情?可能是 XY 问题。
  • @super 这是我弟弟的作业要求。这就是为什么我感到困惑
  • operator++() 的前缀形式可能是成员,而后缀是非成员,反之亦然。任何一种形式都不可能同时是成员和非成员,因为这会导致模棱两可(例如,两个函数都非常匹配 ++xx++)。 friend 声明声明非成员形式(因此前缀形式的 friend 声明不能与前缀形式的成员共存)。
  • 我怀疑你哥哥的老师对作业有点不清楚。我建议你哥哥问他的老师澄清一下,或者和他的同学谈谈。

标签: c++ class operator-overloading operator-keyword


【解决方案1】:

大多数运算符可以重载作为成员非成员函数。 一些运算符(=[]()-&gt;)只能作为成员重载。但是您不能将任何操作员同时作为成员非成员,特别是因为不清楚如何选择其中任何一个。

作业想要的大概是:

  • 您将前缀 ++ 作为成员重载,将后缀 ++ 作为非成员重载(在您的情况下,也是朋友)
  • 创建两个独立的程序:一个是这些运算符作为成员重载,另一个是作为非成员重载

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2010-12-26
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多