Kadaj Geschrieben 21. Juni 2012 Teilen Geschrieben 21. Juni 2012 Hallochen, ich versuch grad ein Problem zu lösen, komm aber keinen Schritt weiter. Ich habe einen Quellcode und möchte dazu die entsprechende Klasse schreiben, so dass dieser Quellcode dann funktioniert. Nur für eine Stelle bekomme ich die Operator-Überladung nicht hin: M1[M1.GetLenght()-1]=M1[0]; M1 ist das Objejkt einer Klasse und beinhaltet unter anderem die Variable char *buffer. Ich habe mir gedacht, dass ich für die rechte Seite "M1[0]" folgendes brauche: char& operator[]( int x){ return buffer[x]; } somit habe ich schonmal das char-Zeichen. Aber wie überlade ich den "="-Operator, so dass ich die Funktion die Stelle merkt, an der das char-Zeichen gespeichert werden soll? Mein Ansatz ist: CString operator=( const char c ){ buffer[?] = c; return *this; } Aber ich weiß nicht woher ich den int-Wert nehmen soll, der in dem Quellcode mit angegeben ist. Hat jemand eine Idee? Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Juni 2012 Teilen Geschrieben 21. Juni 2012 Aber wie überlade ich den "="-Operator, so dass ich die Funktion die Stelle merkt, an der das char-Zeichen gespeichert werden soll?Gar nicht. Um welches char es sich handelt, hat der operator[] bereits festgelegt, da gibt es nichts zu merken. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 21. Juni 2012 Autor Teilen Geschrieben 21. Juni 2012 aber mit dem []operator gebe ich doch nur ein char als return-Wert zurück. Ich kann doch den gleichen []operator nicht auf beiden Seiten des "=" verwenden, denn links will ich was schreiben und rechts was lesen. Ich muss doch also nur den =operator überladen um dieses Zeichen zuzuweisen. Wenn ich sowas wie M[num] = habe, dann muss ich das doch irgendwie so überladen, dass ich das einzelne char-Zeichen an genau diese Stelle schreibe. Vielleicht indem ich M[num] als char an die Funktion übergebe? char operator=( const char c ){ return c; } Wenn ich das implementiere, lässt es sich zwar übersetzen aber diese Funktion wird nicht aufgerufen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Juni 2012 Teilen Geschrieben 21. Juni 2012 (bearbeitet) Ich kann doch den gleichen []operator nicht auf beiden Seiten des "=" verwenden, denn links will ich was schreiben und rechts was lesen.Wieso nicht? Du kannst doch auch ein char einem anderen zuweisen. Wenn ich das implementiere, lässt es sich zwar übersetzen aber diese Funktion wird nicht aufgerufen...Du weist char& an char& zu. Deine Klasse hat damit nichts mehr zu tun. Bearbeitet 21. Juni 2012 von Klotzkopp Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 21. Juni 2012 Autor Teilen Geschrieben 21. Juni 2012 (bearbeitet) Dann scheint es ja doch einfacher zu sein, als ich dachte, trotzdem bekomme ich an genau dieser Stelle einen Fehler. So sieht das Programm aus: #include <iostream> using namespace std; #include "cstrg.h" int main() { CString M1 ="Max"; CString M2("Moritz"); CString M3; M3 = M1 + " und " + M2; cout << "Willhelm Busch: \n" << M3 << "\n"; M1="______________"; M1[0]='+'; M1[M1.GetLenght()-1]=M1[0]; cout << "test3\n"; cout << M1 << '\n'; return 0; } und so die Klasse, die ich dazu geschrieben habe: #include <iostream> #include <cstring> #include <cstdlib> #include <cctype> using namespace std; class CString; class CString{ private: char *buffer; int len; public: // Konstruktoren CString(); CString( const char *string ); // Dekonstruktor ~CString(); // Überladen der Operatoren CString operator=( const char *string ){ cout << "Aufruf in = *string\n"; if(strcmp(string,buffer) == 0) return *this; if(strlen(string) > 0) { if(isdigit(len)){ // ist len mit einer Zahl belegt? if(len > 0) delete [] buffer; } len = strlen(string); buffer = new char[len+1]; strncpy(buffer,string,len); } return *this; } friend CString operator+( CString m1, CString m2); friend ostream& operator<<(ostream& os, CString& m); char *GetName(){ return buffer; } char& operator[]( int x){ return buffer[x]; } /* char operator=( const char c ){ cout << "Aufruf in = char\n"; return c; } */ int GetLenght(){ return len; } }; ostream& operator<<(ostream& os, CString& m){ os << m.buffer; return os; } CString::CString(){ len = 0; buffer = new char[1]; buffer[0] = 0; } CString::CString( const char *string ){ if( strlen(string) != 0 ) { len = strlen(string); buffer = new char[len+1]; strcpy(buffer,string); } } CString::~CString(){ delete [] buffer; } CString operator+( CString m1, CString m2){ CString tmp; tmp.buffer = new char[m1.len+m2.len+1]; strncpy(tmp.buffer,m1.buffer,m1.len); strncat(tmp.buffer,m2.buffer,m2.len); return tmp; } Kompilieren lässt dich alles, aber beim Ausführen: ./stringoverload Willhelm Busch: Aufruf in = *string test3 + *** glibc detected *** ./stringoverload: double free or corruption (fasttop): 0x0804c088 *** ======= Backtrace: ========= /lib/libc.so.6(+0x6ff0b)[0xb767ef0b] /usr/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb7876b2f] /usr/lib/libstdc++.so.6(_ZdaPv+0x1b)[0xb7876b8b] ./stringoverload[0x8048960] ./stringoverload[0x8048be8] /lib/libc.so.6(__libc_start_main+0xf3)[0xb7628003] ./stringoverload[0x8048811] ======= Memory map: ======== 08048000-0804a000 r-xp 00000000 00:24 24686514 . . . Anstelle des "+"-Zeichen nach test3 müsste eigentlich der string +-----------+ ausgegeben werden, also hat das mir dem Überladen des []-Operators scheinbar nicht richtig funktioniert, oder sollte dieser Fehler ganz wo anders liegen? Ich hock da bestimmt schon 2 Stunden drüber und habe alle möglichen Schreibweisen der Operator-Überladung ausprobiert und neu erfunden :/ Bearbeitet 21. Juni 2012 von Kadaj Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 21. Juni 2012 Teilen Geschrieben 21. Juni 2012 Die Regel der großen drei: Wenn deine Klasse einen dieser drei (Destruktor, Copy-Zuweisungsoperator, Copy-Konstruktor) braucht, braucht sie alle drei. Deiner Klasse fehlt der Copykonstruktor, daher wird ein automatisch generierter benutzt, wann immer ein Objekt deiner Klasse kopiert wird (z.B. die Argumente von operator+). Und dieser kopiert nur den Zeiger, nicht den Inhalt. Danach zeigen also zwei Objekte auf denselben Puffer, und beim zweiten Destruktor knallt es. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Kadaj Geschrieben 21. Juni 2012 Autor Teilen Geschrieben 21. Juni 2012 (bearbeitet) Jaa, es läuft :-D darauf wäre ich ja nie gekommen. Bald werde ich mir eine Hasen-Skulptur ins Zimmer stellen und sie vor jeder Aufgabe anbeten. Vielen Dank, mal wieder ;-) Bearbeitet 21. Juni 2012 von Kadaj Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.