Join fachinformatiker.de Forum Now
Ergebnis 1 bis 7 von 7
Like Tree1gefällt das
  • 1 Post By Klotzkopp

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 ...

  1. #1
    Reg.-Benutzer
    Reg.-Datum
    17.06.2010
    Ort
    Dresden
    Beiträge
    133

    Frage c++ Problem bei Operatorüberladung

    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:
    Code:
    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:
    Code:
     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:
    Code:
        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ß

    Das Ideal scheitert an der Wirklichkeit

  2. #2
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    9.409

    Standard

    Zitat Zitat von Kadaj Beitrag anzeigen
    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.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  3. #3
    Reg.-Benutzer
    Reg.-Datum
    17.06.2010
    Ort
    Dresden
    Beiträge
    133

    Standard

    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?
    Code:
        char operator=( const char c ){
            return c;
        }
    Wenn ich das implementiere, lässt es sich zwar übersetzen aber diese Funktion wird nicht aufgerufen...
    Das Ideal scheitert an der Wirklichkeit

  4. #4
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    9.409

    Standard

    Zitat Zitat von Kadaj Beitrag anzeigen
    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.

    Zitat Zitat von Kadaj Beitrag anzeigen
    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.
    Geändert von Klotzkopp (21.06.2012 um 23:35 Uhr)
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  5. #5
    Reg.-Benutzer
    Reg.-Datum
    17.06.2010
    Ort
    Dresden
    Beiträge
    133

    Standard

    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:
    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;
    }
    und so die Klasse, die ich dazu geschrieben habe:
    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 m1CString m2);
        
    friend ostreamoperator<<(ostreamosCStringm);

        
    char *GetName(){
            return 
    buffer;
        }

     
    charoperator[]( int x){
            return 
    buffer[x];
        }
    /*
        char operator=( const char c ){
            cout << "Aufruf in = char\n";
            return c;
        } */


        
    int GetLenght(){
            return 
    len;
        }
    };

    ostreamoperator<<(ostreamosCStringm){
        
    os << m.buffer;
        return 
    os;
    }

    CString::CString(){
        
    len 0;
        
    buffer = new char[1];
        
    buffer[0] = 0;
    }

    CString::CString( const char *string ){
        if( 
    strlen(string) != )
        {
            
    len strlen(string);
            
    buffer = new char[len+1];
            
    strcpy(buffer,string);
        }
    }

    CString::~CString(){
        
    delete [] buffer;
    }

    CString operator+( CString m1CString 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:
    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
    .
    .
    .
    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 :/
    Geändert von Kadaj (21.06.2012 um 23:45 Uhr)
    Das Ideal scheitert an der Wirklichkeit

  6. #6
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    9.409

    Standard

    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.
    Kadaj gefällt das.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  7. #7
    Reg.-Benutzer
    Reg.-Datum
    17.06.2010
    Ort
    Dresden
    Beiträge
    133

    Standard

    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

  1. Antworten: 16
    Letzter Beitrag: 06.09.2007, 14:34
  2. Outlook Problem oder Office Problem???
    Von Troll im Forum Anwendungssoftware
    Antworten: 3
    Letzter Beitrag: 02.10.2003, 16:05