PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ : Speicherzugriffsfehler nach Operatoren-Überladen



DanDanger
25-04-2003, 17:50
Hallo,

ich habe in meiner Klasse <TestKlasse> eine Funktion implementiert, die die Werte einiger Privaten Elemente der Klasse ausgibt :



class TestKlasse
{
public :

void Print() ; /* Daten ausgeben */

.........
private :
.......
} ;


Um die Werte bequemer ausgeben zu können, wollt ich den << Operator von ostream überladen, damit solche Aufrufe möglich werden :



TestKlasse Test ;

/* Werte der TestKlasse <Test> ausgeben */
cout << Test << endl ;


Nun habe ich mit :



ostream &operator <<(ostream &out, TestKlasse &Test)
{
/* Print(), um auch auf die Privaten Elemente von "Fahrzeug" zuzugreifen */
Test.Print(out) ;

return out ;
}


den << Operator Überladen. Die Print Funktion sieht so aus :



ostream TestKlasse::Print(ostream &osStream)
{
/* Private Klassen-Daten werden hier in den osStream geschrieben */
osStream << Private_Daten_Der_Klasse ;
}


Das ganze Kompiliert auch wunderbar, leider stürzt das Progamm nach aufrufen von

cout << Test << endl ; (Test ist ein Objekt vom Typ TestKlasse )

mit einem Speicherzugriffsfehler ab.

Wohlgemerkt : Die Daten werden Korrekt ausgegeben, und dann stürzt das Proggi erst ab (Fehler im restlichen Code halte ich für "unmöglich", ohne überladenen Operator läuft alles).

Meine Frage : Was mache ich hier falsch ???

PS: Wenn ich das Zeug unter Visual-C++ (Ver. 6.0) von MS Compiliere, läuft alles PERFEKT, nur mit anderen Compilern (g++, MinGW, etc.) nicht. Woran kann das liegen ???

PPS: Ich weiss, ich hätte die operator-Funktion auch als "friend" in meiner Klasse definieren können, aber ich möchte "friend"-Funktion soweit wie möglich vermeiden.


Neugierige (und mittlerweile Verzweifelte) Grüsse
DanDanger

anda_skoa
26-04-2003, 18:18
Die Print Methode, die du in deiner Klassen Deklaration hast, hat keinen ostream Parameter.

Kannst du vielleicht ein kleines Beispiel mit Klasse, Methode, Operator und main() posten?

Ciao,
_

f0rtex
26-04-2003, 21:46
PPS: Ich weiss, ich hätte die operator-Funktion auch als "friend" in meiner Klasse definieren können, aber ich möchte "friend"-Funktion soweit wie möglich vermeiden.


Ist es nicht so, dass der Ausgabeoperator '<<' als ersten Prameter einen Typ ostream erwartet? D.h. wenn du es nicht als friend deklarierst, ist doch der erste Parameter der this-Zeiger?

Oder täusch ich mich da?

greets
f0rtex

DanDanger
27-04-2003, 12:19
Ist es nicht so, dass der Ausgabeoperator '<<' als ersten Prameter einen Typ
ostream erwartet?
D.h. wenn du es nicht als friend deklarierst, ist doch der erste Parameter der
this-Zeiger?


Genau, deshalb müssen ja die << und >> Operatoren zur Aus und Eingabe auch aussherhalb der Klassen definiert werden.


Mein Beispiel sieht z.Z. so aus :

testKlasse.h :



class TestKlasse
{
public :

ostream Print(ostream &osStream) ;

private :

int Wert ;

} ;

/* Ueberladen des Operators : << ausserhalb der Klassse */
ostream &operator <<(ostream &out, TestKlasse &Testl) ;



... und die Implementation in der testKlasse.cpp :




ostream TestKlasse::Print(ostream &osStream)
{
/* Daten in den Stream schreiben */
osStream << Wert ;

return osStream ;
}


/* Die Implementation des Operator-Ueberladens */
ostream &operator <<(ostream &out, TestKlasse &Test)
{
Test.Print(out) ;

return out ;
}



und das main-Programm :
main.cpp :


void main()
{

/* initialisiert Test mit dem Wert 5 */
TestKlasse Test(5) ;

cout << Test << endl ;
} ;



Wie schon gesagt, er gibt die Daten (hier : der Wert 5) aus, und SegFaultet dann....

Ausserdem : osStream als return-Wert in der Print() - Fkt. der Klasse ist bei den meisten Compilern ungültig (ausser bei VC++ ). Ausskommentieren macht aber nichts ;-)

Neugierige Grüsse
DanDanger

anda_skoa
27-04-2003, 12:28
Original geschrieben von DanDanger

ostream Print(ostream &osStream) ;


Probier mal wie beim Operator eine ostream& als Rückgabewert
Der ostream Copyconstructor ist nämlich private, zumindest behauptet das mein g++

Außerdem willst du ja keine neue Instanz des Streams sonder wie beim Operator den veränderten Stream weitergeben.



ostream& Print(ostream &osStream);


Ciao,
_

DanDanger
27-04-2003, 12:35
JUHUUU,
das war's :-))))

DANKE ;-)