[gelöst] C++ operator [] überladen



  • Ok, Danke, ich werde es mal so versuchen.

    Zu letzterem : Ja, mehrere sogar, aber in einem gehts irendwie nur um MFC und IDEs,in einem anderen nur um C++ Builder oder so, und im 3. können nur Moderatoren Threads erstellen. Habe ich irendwas übersehen ?

    Edit : Meinst du mit der Referenz das ? :

    T* operator[] (int number) {
    return &buffer[number];
    }
    

    So funktionierts auch leider nicht 😕

    Edit 2: Umpf nein. Referenz, ich bin dumm^^(T& als return-wert) Ja so funktionierts, danke !



  • Guck mal richtig hin.
    Es gibt auch ein Forum das nur C++ heißt.
    Den Link kannste dir selber suchen.



  • Am Besten ist es , diesen Operator einmal für den lesenden und für den schreibenden Zugriff zu definieren:

    const T& operator[] (int number) const;
          T& operator[] (int number);
    

    PS: C++ Forum



  • Stimmt, das macht natürlich Sinn 🙂

    Aaach, ich hatte auf Archiv/FAQ geklickt, logisch dass dort nur Moderatoren schreiben können 😛



  • Zwei kleine Tipps noch:

    1. i ist bei dir ne Konstante, also kannst auch direkt in der Klassendefiniton

    T buffer[i]
    

    schreiben. Somit sparst du dir das new.

    2. Du erzeugst für jede einzelne Arraygröße eine neue Templateklasse. MyArray<int,50> ist eine Klasse und MyArray<int,49> ebenso. Daher nimm lieber den Build-In TemplateParameter raus und übergib ihn zB über den Konstruktor.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • KasF schrieb:

    Zwei kleine Tipps noch:

    1. i ist bei dir ne Konstante, also kannst auch direkt in der Klassendefiniton

    T buffer[i]
    

    schreiben. Somit sparst du dir das new.

    2. Du erzeugst für jede einzelne Arraygröße eine neue Templateklasse. MyArray<int,50> ist eine Klasse und MyArray<int,49> ebenso. Daher nimm lieber den Build-In TemplateParameter raus und übergib ihn zB über den Konstruktor.

    Entweder 1 oder 2. Leider nicht beides.
    Ich mag 1 sehr gern.



  • KasF schrieb:

    Zwei kleine Tipps noch:

    1. i ist bei dir ne Konstante, also kannst auch direkt in der Klassendefiniton

    T buffer[i]
    

    schreiben. Somit sparst du dir das new.

    Stimmt eig., ich dachte nur, dass es schöner ist, es mit Konstruktor zu erzeugen^^

    KasF schrieb:

    2. Du erzeugst für jede einzelne Arraygröße eine neue Templateklasse. MyArray<int,50> ist eine Klasse und MyArray<int,49> ebenso. Daher nimm lieber den Build-In TemplateParameter raus und übergib ihn zB über den Konstruktor.

    Hmm kannst du ein konkrets Beispiel geben ? Ich weiß nicht genau, wie du die Umsetzung meinst ^^

    Obwohl ...
    Meinst du : Konstruktor : MyArray(int size) { buffer = new T[size] }

    Das ist natürlich besser ^^ Dank dir !



  • volkard schrieb:

    Entweder 1 oder 2. Leider nicht beides.

    I know 😉

    Kannst du dich daran erinnern, gaaaanz ganz früher. Da hast du mir 2 beigebracht und ich habe es bis heute nicht vergessen 😉

    Edit: Hier http://www.c-plusplus.net/forum/viewtopic-var-p-is-779759.html#779759



  • Haha cooler Thread damals.
    Dürfte ich wissen was damals mit dem ExceptionHandeling so falsch war ?
    Ist doch eigentlich garnichts dran auszusetzten o.0

    Außerdem, welche Methode ist jetzt besser ? 1. oder 2. ? Ich denke doch mal 2. ?
    Den Destruktor sollte ich auchnoch verändern, delte [] buffer; sollte da rein ^^

    Auf jeden Fall Danke nochmal für die Optimierungsvorschläge 🙂
    Mfg
    und schönen Abend noch !



  • Felixxx schrieb:

    Haha cooler Thread damals.
    Dürfte ich wissen was damals mit dem ExceptionHandeling so falsch war ?
    Ist doch eigentlich garnichts dran auszusetzten o.0

    Meinst Du das?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-108478-and-postdays-is-0-and-postorder-is-asc-and-start-is-46.html

    Oder daß man bei Programmierfehlern nicht nur throw machen soll?



  • template <class typ,int size> const typ &MyArray<typ,size>::operator[](unsigned int i) const
    {
    if(i<aktSize)
    return array[i];
    else
    throw out_of_range("Out of Range !!!");

    }

    1. "was soll das denn? das widerstebt mir. irgendwas ist da ganz komisch."
    2. "das widerstebt mir wirklich. irgendwas ist da wirklich ganz komisch.
    das klint so, als wolle man programmierfehler zur laufzeit fangen und heilen"

    Hast Du damals zu diesem Code geschrieben, verstehe nicht was Du damals meintest o.0 Was Dir daran so widerstrebte.



  • Felixxx schrieb:

    Hast Du damals zu diesem Code geschrieben, verstehe nicht was Du damals meintest o.0 Was Dir daran so widerstrebte.

    Der Fehler passiert eigentlich nur, wenn man woanders unsauber programmiert. Ich gehe sogar soweit, zu sagen, daß in einem ordentlichen Programm der Fehler niemals fliegt. Also ist das if da nutzlos. Allenfalls zum Debuggen mag es hilfreich sein. Aber dafür gibt es stärkere Sachen als throw.



  • Ok, klingt logisch 🙂

    An dieser Stelle nochmal Danke an alle Beteiligten und ich wünsche noch einen schönen Abend !

    Mfg


Anmelden zum Antworten