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 ist das Objejkt einer Klasse und beinhaltet unter anderem die Variable char *buffer.Code:M1[M1.GetLenght()-1]=M1[0];
Ich habe mir gedacht, dass ich für die rechte Seite "M1[0]" folgendes brauche:
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:Code:char& operator[]( int x){ return buffer[x]; }
Aber ich weiß nicht woher ich den int-Wert nehmen soll, der in dem Quellcode mit angegeben ist. Hat jemand eine Idee?Code:CString operator=( const char c ){ buffer[?] = c; return *this; }
Gruß
Ergebnis 1 bis 7 von 7
c++ Problem bei Operatorüberladung
Diskussion über c++ Problem bei Operatorüberladung in C und C++ der Kategorie Programmierung; Hallochen, ich versuch grad ein Problem zu lösen, komm aber keinen Schritt weiter. Ich habe einen Quellcode und möchte dazu ...
- 21.06.2012, 21:59 #1Reg.-Benutzer
- Reg.-Datum
- 17.06.2010
- Ort
- Dresden
- Beiträge
- 133
c++ Problem bei Operatorüberladung
Das Ideal scheitert an der Wirklichkeit
- 21.06.2012, 23:21 #2
- 21.06.2012, 23:28 #3Reg.-Benutzer
- Reg.-Datum
- 17.06.2010
- Ort
- Dresden
- Beiträge
- 133
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?
Wenn ich das implementiere, lässt es sich zwar übersetzen aber diese Funktion wird nicht aufgerufen...Code:char operator=( const char c ){ return c; }Das Ideal scheitert an der Wirklichkeit
- 21.06.2012, 23:32 #4
- 21.06.2012, 23:42 #5Reg.-Benutzer
- Reg.-Datum
- 17.06.2010
- Ort
- Dresden
- Beiträge
- 133
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:
und so die Klasse, die ich dazu geschrieben habe:Code:#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; }
Kompilieren lässt dich alles, aber beim Ausführen:PHP-Code:#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;
}
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 :/Code:./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 . . .
Geändert von Kadaj (21.06.2012 um 23:45 Uhr)
Das Ideal scheitert an der Wirklichkeit
- 21.06.2012, 23:51 #6
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 9.409
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."Funktioniert nicht" ist keine ausreichende Problembeschreibung.
- 21.06.2012, 23:59 #7Reg.-Benutzer
- Reg.-Datum
- 17.06.2010
- Ort
- Dresden
- Beiträge
- 133
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 ;-)Geändert von Kadaj (22.06.2012 um 00:02 Uhr)
Das Ideal scheitert an der Wirklichkeit
Aktive Benutzer
Aktive Benutzer
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Ähnliche Themen
-
Problem: 1. das gute alte windows shut down problem!! 2. bios passwort funzt nich
Von floebermann im Forum HardwareAntworten: 16Letzter Beitrag: 06.09.2007, 14:34 -
Outlook Problem oder Office Problem???
Von Troll im Forum AnwendungssoftwareAntworten: 3Letzter Beitrag: 02.10.2003, 16:05


1gefällt das
LinkBack URL
About LinkBacks
Zitieren