Index Operator überladen mit AnsiString



  • Hallo,

    ich möchte bei einer Klasse den Index Operator so überladen, dass folgendes möglich is:

    TMyClass *Foo = new TFoo();
    ...
    // Foo bekommt Daten
    ...
    AnsiString str = Foo["string"];
    

    Also quasi wie es bei einer std::map auch möglich ist. Wie genau muss ich den Indexoperator überladen und was brauche ich noch dafür (Zuweisungsoperator, Copy?).

    Ich habe folgendes probiert:

    AnsiString & TFoo::operator[] (AnsiString str)
    {
     ...
     ...
     return mystr;
    }
    

    Ich bekomme aber immer den Fehler das er TFoo nicht zu AnsiString konvertieren kann.

    Viele Grüße,

    Christian



  • Hallo

    Das einzige Problem was ich sehe ist
    - Deine Klasse heißt TFoo, aber der Pointer den du im Beispiel benutzt hat den Typ TMyClass. Nur ein Schreibfehler?

    - Du kannst nicht auf den Pointer den []-Operator anwenden, du must den zuerst dereferenzieren

    AnsiString str = (*Foo)["string"];
    

    Der Operator selber ist aber in Ordnung.

    bis bald
    akari



  • Hallo Akari,

    vielen Dank für deine Antwort. Ans derefenzieren habe ich gar nicht mehr gedacht 🙄 . Ich werde es dann wohl statisch anlegen, um mir die Schreibarbeit zu sparen (ich habe keine Nachteile).
    Beim Klassennamen habe ich mich einfach nur vertan.

    Grüße,

    Christian



  • Den Parameter beim operator solltest du als konstante Referenz übergeben um unnötige Kopien zu vermeiden.



  • In dem Fall ist das eigentlich egal, da ein AnsiString intern nur einen "char *" als Member besitzt (mehr nicht).
    Und selbst die VCL übergibt AnsiString oftmals als Kopie, aber generell sollte man Klassenobjekte als konstante Referenz übergeben.



  • Genau deswegen sagte ich das ja. 🙂



  • Hallo,

    habe ich auch gemacht ;-). Das oben war ja nur ein schnell geschriebenes Beispiel. Es läuft nun zumindest so in der Anwendung.

    Schönen Tag noch,

    Christian


Anmelden zum Antworten