2010-10-04 8 views
5

я перегружен оператор [] в моем классе Интервал для возврата минут или секунд.Перегрузка оператора индекс «[]» в л-значение и г-значение случаев

Но я не знаю, как присвоить значения минут или второй, используя оператор [].

Например: Я могу использовать это заявление

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; 

} 

I знаю, что я должен объявлять переменные-члены как частные, но я объявил здесь публично только для моего удобства.

+7

Это кажется ужасным примером перегрузки оператора ради него. У вас есть какое-то неясное требование, которое заставляет вас это делать? В противном случае это просто обфускация кода. – jalf

+0

@jalf Я знаю, что это ужасный пример, но я хотел перегрузить [] оператор в универсальном классе для Object Array. – Searock

+0

@jalf: почему http://cpp.sh/4fiz работает без какой-либо ошибки компилятора? Должна ли компилятор выдавать ошибку? Он ничего не дает в качестве результата. Что именно происходит в этой программе. – Destructor

ответ

10

Возвращает ссылку на члена в вопросе, а не его значение:

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

Вау! этот ответ настолько ясен и краток. – ZoomIn

3

возврат по ссылке, чтобы иметь возможность назначать значения и использовать их на LHS оператора присваивания.

+0

Я новичок в C++, так что, пожалуйста, дайте мне пример? – Searock

+2

@Searock жаль, что я собирался добавить пример. Только что написал Vijay, он уже добавил фрагмент. Пожалуйста, обратитесь к этому. В общем случае на C++, если вы хотите использовать значение, возвращаемое вашей операторной операцией overriden на LHS назначения, тогда вы должны возвращаться по ссылке в своей операторной функции overriden. –

6

Перегрузки оп [], чтобы использовать жёстко прописанные «Index» значения не имеет смысла здесь, и вы на самом деле уже есть решение в своем определении класса:

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

Вы можете превратить тех, в методах, а не общественности данных, это несущественно для не перегрузки op []. Однако, поскольку вы также хотите получить доступ к записи, единственным преимуществом, которое может иметь метод, является проверка (например, проверка 0 < = секунды < 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; 
+0

Я знаю, что это не имеет никакого смысла, но все равно что мне делать, если я хочу назначать значения с помощью оператора []. – Searock

+3

@Searock: Другой ответ покрывает его, но я не буду рекомендовать его в качестве решения этой проблемы. – 2010-10-04 10:50:14

+0

@Roger Pate +1 Я знаю, что это очень большой глупый пример, но это просто, чтобы очистить мои сомнения, мой мэм сказал мне, что перегрузка оператора [] для назначения невозможна. – Searock

8

Изменение подписи функции путем удаления const и возвращает ссылку:

long& operator[](int index) 

Теперь вы сможете написать заявления, как:

a[0] = 12; 
+6

Не забудьте перегрузку константы op []. – 2010-10-04 10:48:17

+5

То есть не удаляйте существующий. * Добавить * этот. – visitor

+1

+1 Я хотел бы отметить ваше сообщение как ответ. – Searock

3

преобразующих метод, как указано ниже должно это сделать:

long& operator[](int index) 
1

Ваш массив оператор член индекс должен быть предусмотрен как

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

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

В-для того, чтобы избежать путаницы в случае перегружая оператора подстрочного сценария, рекомендуется использовать версию оператора сценария const и non-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.Таким образом, неконтентная версия оператора подзаголовка будет вызываться автоматически.

С cout << A[1], вы не изменяете объект на index 1. Таким образом, const-версия оператора суб-скрипта будет вызываться автоматически.