views:

162

answers:

6

I have overloaded [] operator in my class Interval to return minutes or seconds.

But I am not sure how to assign values to minutes or second using [] operator.

For example : I can use this statement

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

but I want to overload [] operator, so that I can even assign values to minutes or seconds using

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

My code :

#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;

}

I know I have to declare member variables as private, but I have declared here as public just for my convenience.

Thanks.

+1  A: 

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

Als
I am a beginner in c++, so can you please give me an example?
Searock
@Searock sorry i was about to add the example. Just noticied Vijay already added the snippet. Please refer that. In general in C++ if you want to be able to use value returned by your overriden operator function on LHS of assignment then you should be returning by reference in your overriden operator function.
Als
+6  A: 

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;
Roger Pate
I know it does not make any sense, but still what should I do If I want to assign values using [] operator.
Searock
@Searock: Another answer covers it, but I won't recommend it as a solution for this problem.
Roger Pate
@Roger Pate +1 I know this is a very big stupid example but it's just to clear my doubt, my ma'am told me that overloading [] operator for assigning is not possible.
Searock
+5  A: 

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;
Vijay Mathew
Don't forget a const overload of op[].
Roger Pate
That is, don't remove the existing one. *Add* this one.
visitor
@Vijay Mathew +1 I wish I could mark your post as a answer too.
Searock
+3  A: 

converting the method to as given below should do it:

long& operator[](int index) 
kartheek
+2  A: 

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

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

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
Chubsdad