7

我在班级Interval中重载了 [] 运算符以返回minutesseconds

但我不确定如何使用 [] 运算符将值分配给分钟秒。

例如:我可以使用这个语句

cout << a[1] << "min and " << a[0] << "sec" << endl;

但我想重载 [] 运算符,这样我什至可以使用

a[1] = 5;
a[0] = 10;

我的代码:

#include <iostream>

using namespace std;

class Interval
{

public:

    long minutes;
    long seconds;

    Interval(long m, long s)
    {
        minutes = m + s / 60;
        seconds = s % 60;
    }

    void Print() const
    {
        cout << minutes << ':' << seconds << endl;
    }

    long operator[](int index) const
    {
        if(index == 0)
            return seconds;

        return minutes;
    }

};

int main(void)
{
    Interval a(5, 75);
    a.Print();
    cout << endl;

    cout << a[1] << "min and " << a[0] << "sec" << endl;
    cout << endl;

}

我知道我必须将成员变量声明为私有,但我在这里声明为公有只是为了方便。

4

7 回答 7

11

返回对相关成员的引用,而不是其值:

long &operator[](int index)
{
    if (index == 0)
        return seconds;
    else
        return minutes;
}
于 2010-10-04T10:45:20.710 回答
8

const通过删除并返回引用来更改函数签名:

long& operator[](int index)

现在您将能够编写如下语句:

a[0] = 12;
于 2010-10-04T10:44:34.000 回答
6

重载 op[] 以使用硬编码的“索引”值在这里没有意义,实际上您的类定义中已经有了解决方案:

cout << a.minutes << "min and " << a.seconds << "sec" << endl;

您可以将它们转换为方法而不是公共数据成员,这对于不重载 op[] 是无关紧要的。但是,由于您也需要写访问权限,因此方法的唯一优势是验证(例如检查 0 <= seconds < 60)。

struct Interval {
  int minutes() const { return _minutes; }
  void minutes(int n) { _minutes = n; }  // allows negative values, etc.

  int seconds() const { return _seconds; }
  void seconds(int n) {
    if (0 <= n and n < 60) {
      _seconds = n;
    }
    else {
      throw std::logic_error("invalid seconds value");
    }
  }

  // rest of class definition much like you have it

private:
  int _minutes, _seconds;
};

// ...
cout << a.minutes() << "min and " << a.seconds() << "sec" << endl;
于 2010-10-04T10:42:46.907 回答
3

通过引用返回以能够赋值并在赋值运算符的 LHS 上使用它们。

于 2010-10-04T10:41:56.367 回答
3

将方法转换为如下所示应该这样做:

long& operator[](int index) 
于 2010-10-04T10:44:37.033 回答
1

为避免子脚本运算符重载的情况下出现混淆,建议使用子脚本运算符的constandnon-const版本。

long& operator[](int index);  // non-const function returning reference

long const& operator[](int index) const;// const function returning const reference

使用A[1] = 5,您正在尝试修改位于 的对象index 1。因此,将自动调用非 const 版本的子脚本运算符。

使用cout << A[1],您不会修改 处的对象index 1。因此,子脚本运算符的 const 版本将被自动调用。

于 2012-01-20T05:30:07.587 回答
1

您的数组索引成员运算符应提供为

long& operator[](int index);                    // for non const object expressions

long const& operator[](int index) const;        // for const object expressions
于 2010-10-04T10:48:19.957 回答