Hallo Roland !
Ich glaube mit ziemlicher Sicherheit Deinen Fehler zu sehen.
Probiers mal so :
friend inline bool operator==( EPSString & es, char \*cs );
private:
char \*storeValue;
};
bool operator == (EPSString & es, char \*cs)
{
return 0==strcmp(es.getCString,cs);
}
Nun die etwas laengliche Erklaerung:
Du uebergibst Deiner Funktion operator == ein EPSString Objekt, ohne ihr gesagt zu haben wie ein solches Objekt kopiert wird. Daraufhin kopiert der Compiler einfach alle Datenmember (auch den char*) auf das neue Objekt es.
z.B.
EPSSTring x(„Hallo“);
char test[]=„Hallo“;
if (x==test)
…
Du hast ausserhalb Deiner Funktion ein Objekt x welches einen char * beinhaltet fuer den Du im Konstruktor Speicher angelegt hast. Beim Aufruf von operator == wird das Objekt x wegen des fehlenden Kopierkonstruktors (EPSString( EPString &:wink:) einfach kopiert. Kopieren heisst dann den char * einfach zu kopieren. x und es haben also identische char *. Wenn der Scope der Funktion operator == verlassen wird, wird folgerichtig der Destruktor von es aufgerufen. Dieser gibt den Speicher, auf welchen char * zeigt einfach frei. Damit hast Du dann gleich den char * in x zerstoert (weil ja identisch), so dass es beim naechsten Zugriff auf x zu Fehlern kommt.
Nun die Loesung:
Wenn Dein Objekt Zeiger verwaltet, die auf allocierten Speicher zeigen bekommst Du bei jedem Funktionsaufruf bei welchen Du ein Objekt uebergibst das selbe Problem. Um dies zu loesen musst Du entweder
A: nur eine Referenz auf Dein Objekt uebergeben also wie oben gezeigt EPSString & . Der Destruktor wird dann nicht aufgerufen, da x und es dann zwei Namen fuer das selbe Objekt sind. Dann hast Du aber das Problem, dass Dein uebergebenes Objekt in der Funktion veraendert werden koennte. Um ein Aendern zu verbieten, ist die sauberste und vor allem schnellste Loesung das Objekt als const zu markieren. Die Mustergueltige Deklaration fuer == waere dann.
friend inline bool operator==(const EPSString & es, char \*cs );
B: Du sagst dem Compiler, dass er einen EPSString nicht einfach durch das duplizieren aller Membervariablen kopieren darf indem Du eine Kopierkonstructor erzeugts in welchem Du neuen Speicher anlegst und den ganzen String auf diesen kopierst (langsam und speicherfressend).
Die Deklaration fuer den Kopierkonstruktor waere dann:
public:
EPSString(const EPSString & es);
Dann brauchst Du die Objekte nicht mehr als Referenz zu uebergeben.
Hoffentlich habe ich mich halbwegs verstaendlich ausgedrueckt.
Anmerkung:
Wieso deklarierst Du den operator als friend und nicht als Memberfunktion ?
Fuer den Vergleich EPSString==char * kannst Du den Operator als Memberfunktion deklarieren. Die Funktion wird dann fuer das links vom operator stehende Objekt aufgerufen.
Fuer den Vergleich (char*)==EPSString gehts allerdings nur als friend.
Die Deklaration fuer die beiden Vergleiche waeren dann.
public:
//EPSString == (char \*) als Memberfunktion
inline bool operator==(char \*cs );
//(char \*)==EPSString geht nur als friend
friend inline bool operator==(char \*cs, const EPSString &:wink:;
Tschuess !
Andreas