Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Frage zum überladen des operators []

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.02.2006, 16:53 Uhr
cmos



Ich habe eine Frage zum Überladen des [] Operators.
Habe hierfür ein paar Zeilen Code eingefügt.
Warum muss ich in der Funktion für das Überladen
return feld[neues_feld] zurückgeben und kann nicht
über return *this gehen ?
Bei anderen Operatoren, z.b. -, kann ich doch auch mit return *this
arbeiten.
Bsp.:

C++:
komplex& komplex::operator-(const komplex& k2)
{
     rababer rababer...
     return *this;
}



Hier der eigentliche Code...


C++:
class op
{
    private:
        double *feld;
        int feldlaenge;
      
    public:
        op(int);
        ~op();
        double& operator[](int);
};



C++:
double& op::operator [](int neues_feld)
{
    feld = new double[neues_feld];
    return feld[neues_feld];

}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.02.2006, 17:27 Uhr
virtual
Sexiest Bit alive
(Operator)


Also erstmal bezwefel ich daß der Code das tut, was Du willst: imöglich, daß du es so willst, wie es da steht, aber es würde den Konventionen widersprechen.

Vom op[] erwartet man im Allg., daß er den schreibenden under/oder lesenden Zugriff auf ein über einen index referenziertes Feld erlaubt. Ist a ein Array, dann soll ja a[b] das (b+1)ste Feld zurückliefern.

Bei Deiner op Klasse würde ich also erwarten, daß letztlich ein Element aus der Membervariablen feld zurückgeliefert wird:

C++:
double& op::operator [] (int index) {
     return feld[index];
}


Da das Feld ein Array von doubles ist, ist der Returnwert von op[] ein double&. Mithin ist *this aber kein double&, sondern eben ein op Objekt. von daher macht es beim op[] für gewöhnlich keinen sinn, *this zurückzulieferen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.02.2006, 23:07 Uhr
cmos



Hallo,
danke erstmal.
Das mit dem double& habe ich so schawarz auf weiss in einem
Tut bzw. E-Book stehen.

Grüße,
cmos

PS:
Jetzt fällt mir ein wie du das meinst.
Das überladen was du meintest, dien dazu einfach das
entsprechende Element auszugeben ohne über
diverse a.gib_feld(int) usw. zu gehen.
Werde mir das Beispiel nochmal ansehen, verstehe jetzt nämlich nicht
was damit bezweckt wurde.

Dieser Post wurde am 28.02.2006 um 23:20 Uhr von cmos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.03.2006, 06:58 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von cmos:
Hallo,
danke erstmal.
Das mit dem double& habe ich so schawarz auf weiss in einem
Tut bzw. E-Book stehen.

Tja, dadurch wirds eben auch nicht richtiger. Es ist ja sogar noch schlimmer:

C++:
double& op::operator [](int neues_feld)
{
    feld = new double[neues_feld];
    return feld[neues_feld];

}


Angenommen, neues_feld ist 3, dann wird ein Array von doubles angelegt und nach feld geschrieben. Gültige Indizes in diesem Array sind aber nur 0, 1, und 2. Das abschliessende return greift also auf nicht vorhandenden Speicher zu.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.03.2006, 08:11 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von virtual:


C++:
double& op::operator [](int neues_feld)
{
    feld = new double[neues_feld];
    return feld[neues_feld];

}


Angenommen, neues_feld ist 3, dann wird ein Array von doubles angelegt und nach feld geschrieben. Gültige Indizes in diesem Array sind aber nur 0, 1, und 2. Das abschliessende return greift also auf nicht vorhandenden Speicher zu.

... und wenn er schonmal aufgerufen worden ist (und nicht abgestürzt ist) dann überschriebt er feld wieder ohne es freizugeben -> speicherleck oder auch wenn neues_feld 0 ist? das erzeugt auf jedenfall ne exception (o.ä) wenn man ein 0 elemente großes feld anlegen will ;-)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.03.2006, 08:29 Uhr
cmos



Hallo,
nicht das Buch hat einen Fehler gemacht sondern ich.
Ich habe 2 verschiedene Sachen zusammengwürfelt.
Gerade habe ich nochmal anchgelesen.
Sie standen direkt übereinandern. Das Feld wurde im
Konstruktor dynamisch erzeugt. Die double& Funktion gibt wirklich
nur das entsprechende Feldelement wieder.
Jetzt macht das auch alles wieder Sinn.
Also, Entschuldigung für das Chaos...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: