Tips für weitere Funktionen in eigener String-Klasse



  • - alle Zeichen umdrehen (zum rückwärts Lesen üben)
    - entschlüsseln mit einem weiteren Schlüsselstring
    - Verschlüsseln nach verschiedenen Techniken
    - Umwandlung in Zahlenformate
    - automatische Rechtschreibprüfung
    - Übersetzung in andere Sprachen
    - TxtToSpeech
    - usw.



  • lol



  • Wie wär's damit?

    - toupper
    - tolower
    - reverse
    - trim
    - trim_front
    - trim_back
    - capitalize



  • omfg schrieb:

    lol

    Immer wieder der alte Käse ist doch langweilig. 😃



  • automatische Rechtschreibprüfung

    Das gefällt mir persönlich am besten.. 😃



  • Stefan schrieb:

    Wie wär's damit?
    - toupper
    - tolower
    - capitalize

    Kann schwer ins auge gehen. Das wird nicht umsonst von den streams, insbesondere den locales übernommen. Das ist keine Triviale Angelegenheit, sobald man den standardmäßig garantierten zeichensatz verlässt(der nichtmal den kompletten ASCII umfasst)

    - reverse

    Dafür gibts nen STL algorithmus.

    Mein Vorschlag: wenn man schon nen string selbst baut, sollte man sich der Aufgabe stellen, ihn standardalgorithmus kompatibel zu machen.

    Es fehlt also noch das komplette iterator interface der Klasse.
    begin/end rbegin/rend usw. Also das wär wirklich was 🙂 ein Interface in dem das Iterator konzept komplett durchgezogen wäre.



  • oje... hätt ich doch bloß nichts gepostet^^ bin jetzt total überfordert...

    was ist denn an den operator+ funktionen falsch?

    außerdem ist schon ne reverse funktion drin...

    ach ja und was ist falsch mit den const-anweisungen?

    Danke im voraus^^



  • Ja,so eine std::string Klasse (besser) nachzubauen ist nicht so einfach,wie man sich am Anfang vielleicht denkt.



  • öhm eigentlich hatte ich ja auch nicht vor sie besser zu programmieren.^^

    1).ich versuche mal gerade ein paar tipps durchzuführen, mit dem copy-konstruktor, da kann ich ja eigentlich die operator= funktion aufrufen, oder? die soll ja auch eine neue Stringklasse machen und dann alles rüberkopieren und dann zurückgeben, oder?

    2). was ist besser, mir wurde ja angeraten die funktionen wenn es geht außerhalb der klasse zu setzten, soll ich nun friends nehmen um direkt auf die private member zuzugreifen, oder per funktionen auf die elemente, und dann nicht per friends. Beide Wege müssten klappen, ich weiß aber nicht welcher besser ist



  • uhsuhz schrieb:

    2). was ist besser, mir wurde ja angeraten die funktionen wenn es geht außerhalb der klasse zu setzten, soll ich nun friends nehmen um direkt auf die private member zuzugreifen, oder per funktionen auf die elemente, und dann nicht per friends. Beide Wege müssten klappen, ich weiß aber nicht welcher besser ist

    Sofern es möglich ist, nicht als friend. Wenn es nicht geht, oder zuviel overhead bedeuted, dann natürlich friend 🙂



  • uhsuhz schrieb:

    , mit dem copy-konstruktor, da kann ich ja eigentlich die operator= funktion aufrufen, oder? die soll ja auch eine neue Stringklasse machen und dann alles rüberkopieren und dann zurückgeben, oder?

    Nein, die Aufgabe des Zuweisungsoperators ist etwas weiter gefasst. Dieser Operator ist insbesondere auch dafür zuständig, den existierenden "alten" Inhalt des Objekts ordentlich freizugeben. Das ist etwas, das der Copy-CTor niemals tun muss (oder darf).

    Es gibt den den Ansatz, den Zuweisungsoperator über den Copy-CTor als "Copy & Swap" zu implementieren, d.h. so:

    Stringclass& Stringclass::operator=( const Stringclass& rhs )
    {
        Stringclass temp( ths );
        /*this->*/Swap( temp );
        return *this;
    }
    

    Dazu brauchst du die bereits angesprochene effiziente Swap-Methode. Dieser Ansatz hat den Vorteil, dass du nur den Copy-CTor ausprogrammieren musst, und dass der Zuweisungsoperator dadurch auf die Prüfung auf Selbstzuweisung verzichten kann und exceptionsicher wird.



  • Stringclass& Stringclass::operator=( const Stringclass& rhs )
    {
        Stringclass temp( ths );
        /*this->*/Swap( temp );
        return *this;
    }
    

    Oh, das ist clever! Wieder etwas gelernt. 😋



  • uhsuhz schrieb:

    oje... hätt ich doch bloß nichts gepostet^^ bin jetzt total überfordert...

    ne ne, du musst es anders sehen:
    viele möglichkeiten etwas zu tun, genug ideen damit du lange beschäftigt bist

    was ist denn an den operator+ funktionen falsch?

    der operator+ erstellt ein neues objekt:
    a+b liefert c und ändert a und b nicht.
    du lieferst aber nur eine referenz und kein neues objekt

    ach ja und was ist falsch mit den const-anweisungen?

    einige funktionen wie zB length() verändern das objekt nicht und sollten daher als const markiert sein.

    damit ich

    Stringclass const s("hallo");
    return s.length();
    

    machen kann



  • ach so^^ habs jetzt verstanden, danke für die Hilfe.

    Das mit dem operator+ wird mir jetzt auch klar, hab da nicht nachgedacht.

    Stringclass& Stringclass::operator=( const Stringclass& rhs )
    {
        Stringclass temp( ths ); //<- müsste da nicht rhs stehen, steht jedenfalls oben in der deklaration
        /*this->*/Swap( temp );
        return *this;
    }
    

    Sind die anderen const anweisungen denn korrekt?

    Danke uhsuhz



  • Der string sollte nicht auf ein char == ein Zeichen begrenzt sein, sondern seine Zeichengröße auf den Verwendeten Zeichensatz anpassen.



  • unicoder schrieb:

    Der string sollte nicht auf ein char == ein Zeichen begrenzt sein, sondern seine Zeichengröße auf den Verwendeten Zeichensatz anpassen.

    hää versteh ich jetzt nicht ganz^^ vielleicht könntest du das genauer erklären



  • uhsuhz schrieb:

    hää versteh ich jetzt nicht ganz^^ vielleicht könntest du das genauer erklären

    char kann maximal 255 verschiedene zeichen darstellen. Der Unicodezeichensatz beispielsweise hat aber 100000 Zeichen. du verstehst das Problem? 🙂



  • ach so... hmm das wird mir jetzt aber glaub ich schon ein wenig zu weit^^, ich glaube ich beschränke mich mal auf char, immerhin habe ich noch nicht so viel Erfahrung.Vielleicht kann ich später die klasse um schreiben

    Also habe jetzt mal angefangen die klasse zu schreiben, hab jetzt mal die konstruktore und den destruktor geschrieben, würde gerne wissen ob die schon mal ok sind, also vom aufbau her:

    #ifndef STRINGCLASS_H
    #define STRINGCLASS_H
    
    typedef unsigned int UINT;
    
    class Stringclass
    {
    private:
        char* data;
        UINT size;
    public:
        Stringclass();
        ~Stringclass();
        Stringclass(const Stringclass&);
    
    };
    
    #endif
    
    #include "Stringclass.h"
    
    Stringclass::Stringclass()
    {
        size = 0;
        data = new char[size];
    }
    
    Stringclass::~Stringclass()
    {
        delete[] data;
    }
    
    Stringclass::Stringclass(const Stringclass& sc)
    {
        size = sc.size;
        data = new char[size];
        for(UINT i=0;i<size;i++)
            data[i] = sc.data[i];
    }
    

    Die funktionen funktionnieren zwar alle, aber vielleicht könnte mal es ja anders schreiben oder es könnten fehler später auftreten.



  • 😉 Initialisierungsliste benutzen

    😉

    for(UINT i=0;i<size;i++)
            data[i] = sc.data[i];
    

    Sowas wirst du in der klasse oefters brauchen. du solltest das also in eine funktion auslagern. idealerweise gibt es dafuer zB std::memcpy oder std::copy. Du kannst es natuerlich auch selber schreiben der Uebung wegen, aber eine eigene funktion sollte es schon sein (denn doppelten code will man nie haben. immer wenn du code mehr als einmal brauchst, schreit dass nach abstraktion)

    PS:
    ignoriere das Unicode Problem (also dass char nur 256 Zeichen beinhalten kann) erstmal. das thema ist zu komplex und laengt nur vom eigentlichen thema ab.



  • Shade Of Mine schrieb:

    PS:
    ignoriere das Unicode Problem (also dass char nur 256 Zeichen beinhalten kann) erstmal. das thema ist zu komplex und laengt nur vom eigentlichen thema ab.

    richtig, ich glaub allerdings auch nicht, dass unicoder den Vorschlag ernst meinte :). Andererseits ist es interessant(zumindest wars das für mich), sich mit unicode zu beschäftigen, und einen wtf moment nach dem anderen beim durchlesen der featureliste zu haben 😃


Anmelden zum Antworten