C ++: Eine praktische Möglichkeit für den Zugriff auf operator [] aus der Klasse?

StackOverflow https://stackoverflow.com/questions/605037

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe eine C ++ Klasse, die operator[], die Array-Index / Klammern Betreiber überlastet. Das ist furchtbar bequem außerhalb meiner Klasse, wo ich foo[bar schreiben kann]. Aber ich kann nicht herausfinden, wie diese Art der Notation zu verwenden, wenn ich die Umsetzung Methoden innen meine Klasse.

Ich weiß, ich operator[](bar) oder this->operator[](bar) schreiben kann, aber die sind ziemlich sperrig und nehmen viel Bequemlichkeit des Bedieners in erster Linie entfernt. (Ich weiß, kann ich auch nur eine neue Methode hinzufügen, die den Operator aufruft.) Gibt es eine Möglichkeit, ich this[bar] oder this->[bar] oder etwas ähnlich schön schreiben kann?

Hinweis . Diese Frage auch auf die vielen unäre Operatoren gelten kann (? Z, wie kann ich foo++ aus der Klasse nennen), aber ich persönlich nur über operator[] Pflege

Bearbeiten : Ich erkennen bald nach der Einlieferung, dass ich (*this)[bar] verwenden kann. Alle Antworten sind bisher vorgeschlagen dies auch. Gibt es noch andere Alternativen?

War es hilfreich?

Lösung

(*this)[bar];

funktioniert gut für mich.

Andere Tipps

Eine Alternative zu (*this)[bar] ist eine benannte Member-Funktion zu verwenden, die die Arbeit von operator[] tut. Überladene Operatoren die Dinge einfacher für die Benutzer. Noch wichtiger ist, sie sind Teil der Klasse Schnittstelle . Fragen Sie sich, ob es wirklich sinnvoll ist, Ihre Klasse in Bezug auf seine eigenen öffentlichen Schnittstelle zu implementieren. Wenn nicht, schlage ich vor, eine separate (geschützt oder privat) Member-Funktion zu schreiben, die Arbeit zu tun, und dann habe operator[] und andere Funktion es nennen.

Ich verwende eine an () Funktion, und habe den Operator [], um die in () Funktion hinter den Kulissen rufen, so Operator [] ist nur syntaktischer Zucker. Das ist, wie std :: vector tut es, so scheint es wie eine vernünftige (mit Vorrang) Art und Weise, es zu tun.

Jetzt für einen vollständigen syntaktischen Zucker Hack (kann nicht sagen, dass ich es sehr empfehlen, aber vielleicht Ihre Phantasie schlagen):

class Widget
{
    Widget&     self;
public:
    Widget() :self(*this)
    {}

    void operator[](int)
    {
        printf("hello");
    }

    void test()
    {
        //scripting like sugar
        //you pay the price of an extra reference per class though
        self[1]; 
    }
};


int main(int argc, char* argv[])
{
    Widget w;
    w[1];
    w.test();
    return 0;
}

Auch wenn Sie dies kostenlos tun wollen, ohne die Kosten des Bezugs zu zahlen, und sind ein Anhänger von einem bösen Sekt gewidmet Programmierer zu machen leiden Sie tun können:

#define self (*this)

Eigentlich denke ich, das ist, wie die meisten Griffe in Apples NS-API implementiert werden ...

Mit

(*this)[bar]

die operator[] der Instanz-Objekt aufzurufen.

this[bar] behandelt den this Zeiger als Array und Indizes das bar-te Element des Arrays (eine wahrscheinliche-invalid Objektreferenz zurückkehrt).

Sie nutzen könnten (* this) [bar] , aber das ist vielleicht nicht viel von einer Verbesserung sein ...

 operator[](bar) 

Dies sollte auch funktionieren. Es funktioniert für mich!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top