== Operator überladen



  • Hallo,

    ich muss von der Schule aus eine eigene String Klasse schreiben. Dabei soll unter anderem auch der == Operator überladen werden. Jetzt stellt sich mir die Frage wieso mein Testprogramm auch wenn die beiden Strings die verglichen werden sollen gleich sind, nicht in die if-Anweisung reinspringt.

    Hier der Code:

    main

    #include <QtCore/QCoreApplication>
    
    #include <stdio.h>
    #include <QDebug>
    #include "mystring.h"
    
    int main(int argc, char *argv[])
    {
    
        const char *ptr = "Irgendwas";
        const char *ptr2 = "Irgendwas";
        MyString * lol = new MyString(ptr);
        MyString * lol2 = new MyString(ptr2);
        lol->display();
        lol2->display();
    
        if(lol==lol2){
            qDebug()<< "Yes";
        }
        else{
            qDebug()<<"No";
        }
    
       return 0;
    }
    

    mystring Klasse:

    #include "mystring.h"
    #include "string.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <QDebug>
    
    using namespace std;
    
    MyString::MyString()
    {
        m_len=0;
        m_string = new char[1];
    }
    
    MyString::MyString(const char *pstr){
        m_len = strlen(pstr);
        m_string = new char [m_len+1];
        m_string = strcpy(m_string,pstr);
    }
    
    MyString::MyString(int plen){
        m_len = plen;
        m_string = new char [m_len+1];
    }
    
    MyString::MyString(char ch, int n){
        m_len = n;
        m_string = new char [m_len+1];
        for(int i=0;i<m_len;++i){
            m_string[i]=ch;
        }
        m_string[m_len] = '\0';
    }
    
    MyString::~MyString(){
        free(m_string);
    }
    
    int comp(const void *elem1, const void *elem2){
        return *(char*)elem1 - *(char*)elem2;
    }
    
    void MyString::sort(){
       return qsort(m_string,m_len,sizeof(char),comp);
    }
    
    char MyString::get(int p) const{
        return m_string[p-1];
    }
    
    void MyString::set(int p, char ch){
        m_string[p-1] = ch;
    }
    
    void MyString::display () const{
        for(int i=0;m_string[i]!='\0';++i){
            qDebug() << m_string[i];
        }
    }
    
    bool MyString::operator==(const char *s){
        qDebug()<<"Drin";
        if(strcmp(m_string,s)==0){
            return true;
        }
        else{
            return false;
        }
    }
    

    mystring Header:

    #ifndef MYSTRING_H
    #define MYSTRING_H
    
    #include <ostream>
    
    using namespace std;
    
    class MyString
    {
    private:
        char* m_string;
        int m_len;
    
    public:
        MyString();
        MyString(const char* pstr);
        MyString(int plen);
        MyString(char ch, int n);
    
        void sort();
        char get(int p) const;
        void set(int p, char ch);
        void display() const;
        ~MyString();
    
        // void append(const char* pstr);
    
        // friend ostream& operator<<(ostream& o, const MyString& e);
       bool operator==(const char *s);
       // bool operator==(const MyString& e);
    
       // MyString& operator=(const MyString& e);
        // MyString(const MyString& e);
    
        //char& operator[](int i);
        //char operator[](int i) const;
    
        //MyString operator+(const MyString& e);
    };
    
    #endif // MYSTRING_H
    

    Hoffe mir kann jemand weiterhelfen da ich langsam keine lust mehr habe ratlos auf das Programm zu starren ^^



  • Da du in main mit Zeigern arbeitest (was aber keinen Sinn macht), musst du diese auch Dereferzieren:

    if(*lol == *lol2) {
    

    ( Benutze bitte beim nächsten Mal statt Code den C/C++ Button für Quellcode, dann sieht es so schön farbig aus 🙂 )

    Außerdem gibts du den Speicher nicht wieder frei:

    delete lol;
    delete lol2;
    

    Und hier noch die Variante ohne Zeiger und dynamische Speicheranforderungen (besser! Benutze besser diese Variante)

    #include <QtCore/QCoreApplication>
    
    #include <stdio.h>
    #include <QDebug>
    #include "mystring.h"
    
    int main(int argc, char *argv[])
    {
    
        const char *ptr = "Irgendwas";
        const char *ptr2 = "Irgendwas";
        MyString lol(ptr);
        MyString lol2(ptr);
        lol->display();
        lol2->display();
    
        if(lol==lol2){
            qDebug()<< "Yes";
        }
        else{
            qDebug()<<"No";
        }
    
       return 0;
    }
    

    PS: Kommst du von Java? Da muss man alles mit new Anfordern, aber Java hat im Gegensatz zu C++ einen Gabarge Collector.



  • Jep ich hab bisher eigentlich immer mit Java gearbeitet, da fällt es noch schwer sich daran zu gewöhnen, dass in C++ der Garbage Collector nicht hinterher putzt



  • Allerdings, wie ich schon gesagt habe, brauchst du hier gar kein new/delete.



  • Ok. Übrigens danke für die Hilfe, jetzt läufts



  • @pyhax: Naja, das kleine Bsp. welches mit String Literalen arbeitet funktioniert natürlich ohne dynamischen Speicher-Allokation. Jedoch schien mir MyString mehr ein Versuch einer String-Klasse und bei einer einigermassen sinnvollen und flexiblen String-Klasse wird typischerweise in irgendeiner Form dynamischer Speicher benötigt.

    @Mister004:
    Achtung, new benötigt immer ein delete, new[] immer ein delete[] und malloc() und Konsorte immer ein free() - mischen ist falsch und ein Problem!

    Ausserdem sollst Du die Grosse Drei bei deiner String-Klasse beachten - oder Zuweisen und Kopieren verbieten.



  • theta schrieb:

    @pyhax: Naja, das kleine Bsp. welches mit String Literalen arbeitet funktioniert natürlich ohne dynamischen Speicher-Allokation. Jedoch schien mir MyString mehr ein Versuch einer String-Klasse und bei einer einigermassen sinnvollen und flexiblen String-Klasse wird typischerweise in irgendeiner Form dynamischer Speicher benötigt.

    Ja ... aber doch nicht in der main! In der Klasse selber, ja.



  • pyhax schrieb:

    theta schrieb:

    @pyhax: Naja, das kleine Bsp. welches mit String Literalen arbeitet funktioniert natürlich ohne dynamischen Speicher-Allokation. Jedoch schien mir MyString mehr ein Versuch einer String-Klasse und bei einer einigermassen sinnvollen und flexiblen String-Klasse wird typischerweise in irgendeiner Form dynamischer Speicher benötigt.

    Ja ... aber doch nicht in der main! In der Klasse selber, ja.

    Ah.. i see... 🤡


Anmelden zum Antworten