Overloading the subscript operator “[ ]” in the l-value and r-value cases

蹲街弑〆低调 提交于 2019-12-04 06:10:00

Return a reference to the member in question, instead of its value:

long &operator[](int index)
{
    if (index == 0)
        return seconds;
    else
        return minutes;
}

Change the function signature by removing the const and returning a reference:

long& operator[](int index)

Now you will be able to write statements like:

a[0] = 12;

Overloading op[] to use hardcoded "index" values doesn't make sense here, and you actually already have the solution in your class definition:

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

You can turn those into methods instead of public data members, that's inconsequential for not overloading op[]. However, since you want write access as well, the only advantage a method would have is validation (e.g. checking 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;

return by reference to be able to assign values and use them on the LHS of the assignment operator.

converting the method to as given below should do it:

long& operator[](int index) 

Your array index member operator should be provided as

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

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

In-order to avoid confusion in the case of overloading the sub-script operator, it is recommended to use the const and non-const version of the sub-script operator.

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

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

With A[1] = 5, you are trying to modify the object at index 1. So the non-const version of the sub-script operator will be invoked automatically.

With cout << A[1], you are not modifying the object at index 1. So the const version of the sub-script operator will be invoked automatically.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!