Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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ß

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

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

Geschrieben (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 von Klotzkopp
Geschrieben (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 von Kadaj
Geschrieben

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.

Geschrieben (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 von Kadaj

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...