2010-10-04 7 views
5

Ich habe überladenen Operator [] in meiner Klasse IntervallMinuten oder Sekunden zurück.Überlastung des Index-Operators "[]" in den L-Wert und r-Wert Fällen

Aber ich bin nicht sicher, wie Werte Minuten zuweisen oder zweite mit Operator [].

Zum Beispiel: Ich kann diese Anweisung verwenden

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

aber ich will Operator [] zu überlasten, so dass ich sogar Werte zu Minuten oder Sekunden zuordnen können mit

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

Meine 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 Ich weiß, dass ich Mitgliedsvariablen als privat deklarieren muss, aber ich habe sie hier nur für meine Bequemlichkeit als öffentlich deklariert.

+7

das scheint ein schreckliches Beispiel für die Überlastung des Betreibers zu sein. Haben Sie eine obskure Anforderung, die Sie dazu zwingt? Ansonsten ist es nur Codeverschleierung. – jalf

+0

@jalf Ich weiß, dass es ein schreckliches Beispiel ist, aber ich wollte den Operator [] in der generischen Klasse für Object Array überladen. – Searock

+0

@jalf: Warum funktioniert http://cpp.sh/4fiz ohne Compilerfehler? Sollte der Compiler keinen Fehler ausgeben? Es gibt nichts als Ausgabe. Was genau passiert in diesem Programm? – Destructor

Antwort

10

einen Verweis auf das betreffende Mitglied zurück, statt dem Wert:

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

Wow! Diese Antwort ist so klar und prägnant. – ZoomIn

3

Rückgabe als Referenz, um Werte zuweisen und sie auf der linken Seite des Zuweisungsoperators verwenden zu können.

+0

Ich bin ein Anfänger in C++, also kannst du mir bitte ein Beispiel geben? – Searock

+2

@Searock Sorry, ich wollte das Beispiel hinzufügen. Just noticed Vijay hat das Snippet bereits hinzugefügt. Bitte beziehen Sie sich darauf. Im Allgemeinen in C++, wenn Sie in der Lage sein möchten, den Wert zu verwenden, der von Ihrer überschriebenen Operatorfunktion auf LHS der Zuweisung zurückgegeben wird, sollten Sie durch Verweis in Ihrer überschriebenen Operatorfunktion zurückkehren. –

6

Überlastung op [] hartcodiert „index“ Werte zu verwenden, macht keinen Sinn hier machen, und Sie eigentlich schon die Lösung in Ihrer Klassendefinition haben:

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

Sie können diese in Methoden drehen, anstatt öffentlich Datenmitglieder, das ist belanglos für nicht überladen op []. Da Sie jedoch auch Schreibzugriff wünschen, ist der einzige Vorteil, den eine Methode haben würde, die Validierung (z. B. Überprüfung 0 < = Sekunden < 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

Ich weiß, es macht keinen Sinn, aber was soll ich tun, wenn ich Werte mit dem Operator [] zuweisen möchte. – Searock

+3

@Searock: Eine andere Antwort deckt es ab, aber ich werde es nicht als eine Lösung für dieses Problem empfehlen. –

+0

@Roger Pate +1 Ich weiß, dass dies ein sehr großes dummes Beispiel ist, aber es ist nur um meine Zweifel zu beseitigen, meine Ma'am sagte mir, dass ein Überladen des [] Operators zum Zuweisen nicht möglich ist. – Searock

8

Ändern Sie die Funktionssignatur durch die const entfernen und Zurückgeben eines Referenz:

long& operator[](int index) 

Jetzt können Sie Erklärungen schreiben wie:

a[0] = 12; 
+6

Vergessen Sie nicht eine konstante Überladung von op []. –

+5

Das heißt, entfernen Sie nicht das vorhandene. * Add * dieses. – visitor

+1

+1 Ich wünschte, ich könnte Ihren Beitrag auch als Antwort markieren. – Searock

3

, um das Verfahren zur Konvertierung gegeben unten sollte es tun:

long& operator[](int index) 
1

Ihr Arrayindex Mitglied Betreiber sollten als

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

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

In Ordnung zu vermeiden Verwirrung im Fall vorgesehen sein, Beim Überladen des Subskriptoperators wird empfohlen, die const und non-const Version des Subskriptoperators zu verwenden.

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

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

Mit A[1] = 5, Sie versuchen, das Objekt an index 1 zu ändern.Daher wird die nicht konstante Version des Unterskriptoperators automatisch aufgerufen.

Mit cout << A[1] ändern Sie das Objekt nicht unter index 1. Daher wird die const-Version des Subskriptoperators automatisch aufgerufen.