2010-10-04 14 views
5

me han sobrecargado [] operador en mi clase Intervalo para volver minutos o segundos.La sobrecarga del operador subíndice "[]" en los casos un valor L y R-valor

Pero no estoy seguro de cómo asignar valores a minutos o segundo utilizando [] operador.

Por ejemplo: puedo usar esta declaración

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

pero quiero sobrecargar [] operador, por lo que incluso puede asignar valores a minutos o segundos usando

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

Mi código:

#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 Sé que tengo que declarar las variables miembro como privadas, pero he declarado aquí como público solo para mi conveniencia.

+7

que parece un terrible ejemplo de sobrecarga del operador por el mero hecho de hacerlo. ¿Tienes algún requisito oscuro que te obligue a hacer esto? De lo contrario, es solo ofuscación de código. – jalf

+0

@jalf Sé que es un ejemplo terrible, pero quería sobrecargar al operador [] en la clase genérica para Object Array. – Searock

+0

@jalf: ¿por qué http://cpp.sh/4fiz funciona sin ningún error de compilación? ¿No debería el compilador lanzar un error? No da nada como salida. ¿Qué está pasando exactamente en este programa? – Destructor

Respuesta

10

devolver una referencia al elemento en cuestión, en lugar de su valor:

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

¡Guau! esta respuesta es tan clara y concisa. – ZoomIn

3

devolver por referencia para poder asignar valores y usarlos en el LHS del operador de asignación.

+0

Soy un principiante en C++, entonces ¿podría darme un ejemplo? – Searock

+2

@Searock, lo siento, estaba a punto de agregar el ejemplo. Recién noté que Vijay ya agregó el fragmento. Por favor refiérase a eso. En general, en C++, si desea poder utilizar el valor devuelto por su función de operador sustituida en LHS de asignación, entonces debe devolver por referencia en su función de operador anulada. –

6

sobrecarga op [] para utilizar los valores codificados "índice" no tiene sentido aquí, y que en realidad ya tienen la solución en su definición de clase:

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

Puede activar los métodos en lugar de pública miembros de datos, eso no tiene importancia para no sobrecargar op []. Sin embargo, dado que también desea acceso de escritura, la única ventaja que tendría un método es la validación (por ejemplo, comprobación de 0 < = segundos < 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

Sé que no tiene ningún sentido, pero aún así, ¿qué debo hacer si quiero asignar valores usando el operador []. – Searock

+3

@Searock: Otra respuesta lo cubre, pero no lo recomendaré como una solución para este problema. –

+0

@Roger Pate +1 Sé que este es un gran ejemplo estúpido, pero es solo para aclarar mi duda, mi señora me dijo que la sobrecarga del operador [] para la asignación no es posible. – Searock

8

cambiar la función de firma mediante la eliminación de la const y devolver una referencia:

long& operator[](int index) 

Ahora usted será capaz de escribir frases como:

a[0] = 12; 
+6

No olvide una sobrecarga const de op []. –

+5

Es decir, no elimine el existente. * Agregar * este. – visitor

+1

+1 Me gustaría poder marcar tu publicación como respuesta también. – Searock

3

conversión del método a como se indica a continuación debería hacerlo:

long& operator[](int index) 
1

Su operador miembro de índice de matriz debe ser proporcionado como

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

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

en el fin de evitar la confusión en el caso de Sobrecarga del operador de sub-script, se recomienda usar la versión const y non-const del operador de sub-script.

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

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

Con A[1] = 5, que están tratando de modificar el objeto en index 1.Entonces, la versión no const del operador de sub-script será invocada automáticamente.

Con cout << A[1], no está modificando el objeto en index 1. Entonces, la versión const del operador de sub-script será invocada automáticamente.