String einlesen und als nicht durch 0 terminiertes char-Array speichern, genaueres Inside...



  • das heißt also, ich soll eine Klasse String entwerfen, mit der Speicherung einer Zeichenkette, und einer Methode um die Zeichenkette wieder auszugeben-

    Im hauptprogramm soll ich dann ein Objekt der neuen Klasse "String" erzeugen, in das ich quasi eine vom Benutzer eingegebene Zeichenkette speichere, und mir diese durch die oben genannte get-Methode wieder ausgeben lassen kann auf dem Bildschirm?



  • du hast doch in deinem posting sogar schon die lösung mit angegeben. find die aufgabenstellung auch sehr eindeutig.



  • meinst du damit mein theoretisches Herangehen an die Lösung der Aufgabe?



  • jo. ich seh bei der aufgabe nur zwei knackpunkte, über die man sich gedanken machen sollte:

    - wenn die methode get die interne struktur eines exemplars offenlegt, kann diese u.u. manipuliert werden und zerstört somit die konsistenz des exemplars. deshalb evtl. eine defensive kopie zurückliefern
    - wenn man sich aus gründen der kapselung für eine defensive kopie entscheidet, wie verhindert man effektiv speicherlecks?



  • als Ergänzung steht unter der Aufgabe noch:

    Programmieren Sie Ihre Methoden so, dass keine Kopien von Objekten erstellt werden müssen. Erstellen Sie ein Testprogramm so, dass die Funktion aller geforderten Merkmale demonstriert wird.

    (Zur Erläuterung: die Aufgabe hat noch Teil b) und c), aber ich möchte erstmal den Aufgabenteil a) hinter mich bringen)

    Das könnte man doch so deuten dass die Kapselung erstmal Außen vor gelassen werden kann oder?

    Es steht auch keine Forderung nach einer bestimmten Eingabelänge, daher würde ich zunächst die Menge der Zeichen willkürlich auf sagen wir 20 festlegen...



  • keine kopien? hm, die aufgabe ist doch komplizierter, als sie aussieht 😉 eine begrenzung der eigabelänge sehe ich nicht als vorteil an. den speicher je nach eingabelänge zu allozieren ist nur eine fingerübung. aber die interne datenrepräsentation ohne kopie (!) wieder mit 0 zu terminieren ist nicht trivial.



  • const char* ?



  • Die Aufgabe widerspricht sich doch.
    Wenn intern kein 0 terminiertes Array gespeichert werden darf, wie soll man dann ohne eine Kopie anlegen zu dürfen ein 0 terminiertes Array zurückgeben.
    Geht nich...



  • doch, das geht schon. indem man z.b. eine klasse baut, die den char* cast-operator überlädt, sich also wie nen char verhält, mit ner referenz auf das nicht terminierte char array versorgt und die entsprechenden pointer operatoren überlädt, um bei zugriff auf das "letzte" element eine erzwungene 0 zurückzuliefern.



  • ok dann sollte ich evtl. noch die beiden weiteren Teile der Aufgabe posten, vielleicht lichtet sich dann der nebel 🙂 :

    b) Geben Sie eine Methode für die Verkettung von Instanzen dieser Klasse an (concatenate-Operator "+")

    c) Erstellen Sie einen Copy-Konstruktor und überladen Sie den Zuweisungsoperator!

    Ich habe bisher nur in Java programmiert, und deshalb sind gerade diese Aufgaben für mich doch recht heftig. Sonst würde ich auch nicht nach Hilfe fragen... 😞



  • thordk schrieb:

    doch, das geht schon. indem man z.b. eine klasse baut, die den char* cast-operator überlädt, sich also wie nen char verhält, mit ner referenz auf das nicht terminierte char array versorgt und die entsprechenden pointer operatoren überlädt, um bei zugriff auf das "letzte" element eine erzwungene 0 zurückzuliefern.

    Glaub kaum das sowas verlangt wird, wenn man sich den Rest der Aufgabe anschaut.



  • vielleicht bin ich auch einfach nur zu dumm um die Aufgabe zu verstehen und sie zu lösen, aber selbst wenns so ist wäre ich wirklich unendlich dankbar wenn mir vielleicht jemand auf die Sprünge helfen würde...



  • Schreib ne Klasse String mit dem Konstruktor, ermittle die länge des übergebenen Strings und kopier den in ein entsprechend großes array und speicher die länge in ner variable. (Hier keine Kopie zu machen wäre sehr gefährlich)



  • mit kopien zu arbeiten ist wesentlich sicherer, viel einfacher und generell vorzuziehen. ich würds einfach machen und in den kommentar schreiben, aus welchen gründen eine kopie erzeugt wird.
    mein schnellschuss mit dem char* container hat z.b. nicht berücksichtigt, dass polymorphie für primitive objekte nicht funktioniert 😉



  • gehtnix schrieb:

    ...Wenn intern kein 0 terminiertes Array gespeichert werden darf,...

    Ich glaube nicht, dass diese Aufgabe derart spitzfindig gemeint ist.
    Ich denke mal, der Aufgabensteller möchte hier, dass der Umgang mit expliziten Längen (und nicht mit strlen(), strcpy, ...) geübt/demonstriert wird.
    Und das "Kopieverbot" ist vermutlich auch eher als Vereinfachung gedacht (und vielleicht soll ja in der Folgeübung gezeigt werden, wo dabei die Gefahren liegen).
    Also im Prinzip ist nur doch das hier:

    das heißt also, ich soll eine Klasse String entwerfen, mit der Speicherung einer Zeichenkette, und einer Methode um die Zeichenkette wieder auszugeben-

    in Source zu gießen.
    Ich an Stelles des OPs würde einfach mal loslegen und mir nicht im Vorhinein alle möglichen Interpretationsweisen des Aufgabentextes durchphilosophieren.
    Und wenn dann ein konkretes Ergebnis da ist, können wir hier ja noch Verbesserungsmöglichkeiten/Alternativen diskutieren....
    Ist doch eine Programmieraufgabe und keine Exegese, oder ? 😉

    Gruß,

    Simon2.



  • Die Aufgabe ist IMO komplett dämlich formuliert. Wer auch immer sie formuliert hat ist IMO ganz weit davon entfernt geeignet zu sein um C++ zu unterrichten.
    Alleine das fehlende const im ctor und die Formulierung "Rückgabe ist \0-terminiertes char-array"... OMFG. Bin ich froh dass ich damit nichts zu tun habe!



  • Ich glaube hier soll auch nicht C++, sondern Programmieren unterrichtet werden.



  • doppeldeutig schrieb:

    Ich glaube hier soll auch nicht C++, sondern Programmieren unterrichtet werden.

    Und dann ist es OK so mies formulierte Aufgaben zu stellen?
    BTW: ich glaube auch nicht dass wer auch immer das geschrieben hat kompetent ist Programmieren zu unterrichten. Dafür schreibt er zu schluderig.



  • hustbaer schrieb:

    Die Aufgabe ist IMO komplett dämlich formuliert. Wer auch immer sie formuliert hat ist IMO ganz weit davon entfernt geeignet zu sein um C++ zu unterrichten.
    Alleine das fehlende const im ctor und die Formulierung "Rückgabe ist \0-terminiertes char-array"... OMFG. Bin ich froh dass ich damit nichts zu tun habe!

    Ich wollte gerade das selbe schreiben, aber nun brauche ich es ja nicht mehr ...



  • genau das finde ich ja auch, aber naja ich komme nicht drum rum und muss mit dem doch recht unordentlichen unterlagen zurechtkommen. ich habe jetzt zum testen mal was gecoded, was aber komischerweise nicht funktioniert. ich hab erstmal ein simples proggie geschrieben welches ein objekt erzeugt usw. ich weiß die art und weise sieht komisch aus ich hab jetzt viel getestet aber es geht nicht und dann habe ich mich an ein listing aus meinem buch gehalten doch es geht trotzdem nicht!

    hier erstmal der code:

    #include <iostream>
    
    using namespace std;
    
    class TestObjekt
    {
          public:
                 TestObjekt(int x);
                 ~TestObjekt();
                 int getWert();      
    
          private:
    
          int x_hide;
    };
    
          TestObjekt::TestObjekt(int x)
    
          {
          x_hide=x;
          }
    
          TestObjekt::~TestObjekt(){}
    
          int TestObjekt::getWert()
          {  return x_hide;  }
    
    int main() {
    
       int eingabe=0;
       TestObjekt *test;
    
        cout<<"Bitte geben Sie einen Int-Wert ein! \n";
        cin>>eingabe;
        test=new TestObjekt(eingabe);
    
        cout<<"Der Int-Wert lautet: \n";
        cout<<test.getWert();
    
        cin.get();     
        cin.get();
        return 0;
    }
    

    es kommt jedesmal wenn ich versuche auf die Memberfunktion getWertzuzugreifen der Fehler "getneueKlasse has not been declared".

    ich kenne das alles nur aus Java und würde meinen dass ich keinen Zugriff auf die Methode habe. Aber wieso?

    Da scheint es ein elementares Verständnisproblem zu geben bei mir, hoffe mir kann da jemand helfen!

    Btw.: Ich habe den Code eigentlich anders geschrieben, dieser ist jetzt sehr an mein Buch angelehnt ich kann aber gerne nochmal meine "interpretation" davon posten falls dieser hier doch total falsch sein sollte.

    😞

    edit:

    also ich hab das doch hinbekommen, die Erzeugung des Objekts lief wohl falsch und daher konnte der Konstruktor das Objekt nicht so "bauen" dass daraus im Folgenden die Methode getWert nicht auf das Objekt zugreifen konnte. Wäre natürlich für eine genauere Erläuterung des Fehlers dankbar.

    Code sieht jetzt folgendermaßen aus:

    #include <iostream>
    
    using namespace std;
    
    class TestObjekt
    {
          public:
                 TestObjekt(int x);
                 ~TestObjekt();
                 void setWert(int y);
                 int getWert();      
    
          private:
    
          int x_hide;
    };
    
          TestObjekt::TestObjekt(int x)
    
          {
          x_hide=x;
          }
    
          TestObjekt::~TestObjekt(){}
    
          void TestObjekt::setWert(int x)
          {    x_hide=x;               }
    
          int TestObjekt::getWert()
          {  return x_hide;  }
    
    int main() {
    
       int eingabe=0;
       TestObjekt test(eingabe);
    
       cout<<"Der Standard-Int-Wert lautet: \n";
       cout<<test.getWert()<<"\n";
    
       cout<<"Bitte geben Sie einen Int-Wert ein! \n";
       cin>>eingabe;    
       test.setWert(eingabe);
    
       cout<<"Der Int-Wert lautet jetzt: \n";
       cout<<test.getWert();
    
       cin.get();    
       cin.get();
       return 0;
    }
    

    Jetzt muss ich das ganze erstmal umbauen das char-Arrays anstatt Int-Werte übergeben und gelesen bzw. gesetzt werden können...


Anmelden zum Antworten