C++ Beispiel vom Buch c++ von A bis Z Frage



  • Alls aller erstes, ich möchte bitte keine Diskusion anfangen, ob das Buch gut oder schlecht ist. Ich möchte nur Hilfe für meine Frage bekommen.

    Also, erstmal kurz der Code, um den es geht.

    int anzahl, alter;
    	bool geschlecht;
    	char name[30];
    
    	cout << "Wie viele Personen: ";
    	cin >> anzahl;
    	cout << endl;
    
    	Mensch *zeiger;
    	zeiger = new Mensch[anzahl];
    
    	for(int i=0; i<anzahl; i++)
    	{
    		cout << "Name: ";
    		cin >> name;
    		cout << "Alter: ";
    		cin >> alter;
    		cout << "Geschlecht (m=0, w=1): ";
    		cin >> geschlecht;
    		cout << endl;
    
    		zeiger[i] = Mensch(name, alter, geschlecht);
    	}
    
    	for(int i=0; i<anzahl; i++)
    	{
    		zeiger[i].print();
    	}
    
    	delete [] zeiger;
    

    Läuft soweit auch, nur bei der Ausgabe wird nicht der name ausgegeben. Es wird
    zum Beispiel so ausgegeben:

    ''''''''' 18 Jahre (männlich)

    Die Print-Methode sieht so aus:

    void Mensch::print(void)
    {
    	cout << name << ' ' << alter << " Jahre";
    	test_geschlecht();
    }
    

    Wenn ich nur eine Person eingeben will, wird es ohne eine Fehlermeldung falsch angezeigt. Wenn mehrere Personen, dann kommt zusätzlich noch eine Fehlermeldung
    ala BLOCK_TYPE_IS_VALID(pHead->nBlockUse).

    Die Fehlermeldung kommt seit ich im private-Bereich der Klasse anstatt

    char name[20];
    

    jetzt

    char *name;
    int len;
    

    benutze. Also so, wie es auch im Buch erklärt wird. Die Konstruktoren wurden auch richtig angepasst.

    Ich bitte um vernünftige Antworten, da ich weiss, das das Buch C++ von A bis Z hier anscheinend unter anderem für Kritik sorgt. Danke!!!



  • nexti schrieb:

    Ich bitte um vernünftige Antworten, da ich weiss, das das Buch C++ von A bis Z hier anscheinend unter anderem für Kritik sorgt. Danke!!!

    Haha, das ist noch ziemlich nett ausgedrückt. Die meisten hier wünschen dem Buch wohl das WurstBrot des Todes Supermarktes an den Rücken. 😃

    Zu deinem Problem: Du hast nicht verstanden wie Arrays funktionieren. Wenn's einfach funktionieren soll: Nimm std::string. (Und std::vector gleich noch dazu.) Ansonsten verstehe wie Pointer und Arrays funktionieren. Wenn du genau wissen willst was falsch läuft, zeige mal die Mensch Klasse. (Oder zumindest den Konstruktor und die Membervariablen.)



  • cooky451 schrieb:

    nexti schrieb:

    Ich bitte um vernünftige Antworten, da ich weiss, das das Buch C++ von A bis Z hier anscheinend unter anderem für Kritik sorgt. Danke!!!

    Haha, das ist noch ziemlich nett ausgedrückt. Die meisten hier wünschen dem Buch wohl das Leberwurstbrot des Todes an den Rücken. 😃

    Zu deinem Problem: Du hast nicht verstanden wie Arrays funktionieren. Wenn's einfach funktionieren soll: Nimm std::string. (Und std::vector gleich noch dazu.) Ansonsten verstehe wie Pointer und Arrays funktionieren. Wenn du genau wissen willst was falsch läuft, zeige mal die Mensch Klasse. (Oder zumindest den Konstruktor und die Membervariablen.)

    Was habt ihr alle denn so gewaltig gegen dieses Buch? Das mit CStrings und so ist halt blöd, aber im großen und ganzen ist doch schon recht viel nützliches dabei.
    Ich hab wohl verstanden, wie Pointer und Arrays funktionieren. Das ist bei mir halt jetzt eine ich nenne das mal "Gedankenlücke", die wider vorbeigeht! Kennst du das Buch? Ich meine hast du es gelesen?



  • Auch wenn die einhellige Meinung zur Resteverwertung dieses Buches hier die Verwendung als Klopapier zu sein scheint, sehe ich da zwei sinnvollere Lösungen:
    Für Anfänger: Eine Sammlung von Negativbeispielen. Wenn man seinen Code in dem Buch wiederfindet, lieber noch mal überdenken.
    Für Fortgeschrittene: Witzebuch für Spezialisten, tolle Abendlektüre. 👍
    Ansonsten lies mal diesen Thread, dann verstehst du auch den Gag mit dem WurstBrot. 😉

    Edit:
    Und da du schon gefragt hast, nur mal was mir bei dem Code so direkt einfällt:

    int anzahl, alter; // Anzahl? Wohl eher unsigned, besser std::size_t. Alter? Schon mal Leute mit nem Alter von -3 gesehen?
        bool geschlecht; // Wie ist dein Geschlecht? Wahr! Oh, Danke! -- enum!
        char name[30]; // std::string
    
        cout << "Wie viele Personen: ";
        cin >> anzahl;
        cout << endl; // Wozu? Abgesehen davon '\n'
    
        Mensch *zeiger; // Roher besitzender Zeiger in C++ -> aua. Zudem gibt's hierfür std::vector<>.
        // Und warum wird der Zeiger nicht initialisiert?
        // Zudem ist "zeiger" irgendwie auch einer der nichtssagensten Variablennamen ever. ;)
        zeiger = new Mensch[anzahl];
    
        for(int i=0; i<anzahl; i++) // ++i .. ist verkraftbar
        {
            // Bis hier wurden alter, geschlecht und name nicht mal gebraucht!
            // Das ist eine für meinen Geschmack etwas zu freizügige Interpretation von
            // "So lokal wie möglich, so global wie nötig."
            cout << "Name: ";
            cin >> name; // Hui, mal probiert was passiert wenn man mehr als 29 Zeichen eingibt?
            // <3 buffer overflow exploits
            cout << "Alter: ";
            cin >> alter;
            cout << "Geschlecht (m=0, w=1): ";
            cin >> geschlecht;
            cout << endl; // Schon wieder endl^^
            // Prüfen ob irgendeine dieser Eingaben fehlgeschlagen ist, ist natürlich total überflüssig.
    
            zeiger[i] = Mensch(name, alter, geschlecht);
        }
    
        for(int i=0; i<anzahl; i++)
        {
            zeiger[i].print(); // Das macht man in C++ eher mit Operatorüberladungen.
        }
    
        delete [] zeiger; // vector und new habe ich oben ja schon kommentiert.
    

    Und das war nur irgendein ziemlich kurzes Codebeispiel. Echte Designfehler zeigen sich normalerweise erst bei etwas komplexeren Abhängigkeiten und mehr Code. Verstehst du die hier vorherrschende Meinung jetzt?



  • Der Code ist unvollständing und lässt schlimmes ahnen. Zeig uns deine Mensch-Klasse.

    Das Buch, was du verwendest, hat deswegen einen schlechten Ruf, weil der Autor inkompetent ist. Sein schlechter Programmierstil und seine "Erklärungen" werden als eher schädlich statt nützlich einstuft. Dein aktuelles Problem ist u.a. eine Folge seines schlechten Einflusses.



  • Den Gag hab ich schon verstanden, da ich schon bischen hier rumgelesen hab.
    Kurze Frage nebenbei. Hab hier auch oft gelesen, dass C++ Primer oder wie das Buch heißt gut sein soll. Ist das auch in deutsch? Ansonsten:

    -Das mit int anzahl, alter habe ich bewusst gemacht, da ich es ja nur für mich zum testen de Programms nutze. Und da gebe ich natürlich keine negative Zahl für
    alter ein.

    -Welches Buch findest du gut. Ich möchte auf jeden Fall ein Buch, wo auch
    Netzwerk und GUI-Programmierung erklärt werden, verstehst du?

    -Zu dem Codeaufbau: Ich habe ihn vom Buch, nicht von mir selber. Mit strings ist natürlich besser. Ich weiss nicht, warum das im Buch überhaupt so scheiße gemacht wird. Ich will ja ein anderes, richtiges Buch. Nur will ich auch Netz und GUI mit dabei haben und nicht zu jedem Thema ein seperates (Anfänger)Buch, verstehst du?



  • C++, Netzwerkprogrammierung und GUIs sind aber allesamt sehr komplexe Themen, die nun mal alle ein eigenes Buch verdient haben. (bzw. entsprechend viel Text.) Allerdings fragt sich bei Netzwerkprogrammierung was genau du möchtest. Ein paar Pakete versenden? Da tut's quasi jedes Socket Tutorial im Internet. OSI-Layer, TCP/IP, am besten noch Ethernet und asynchrone Kommunikation mit dem OS Kernel verstehen? Das braucht halt seine Zeit.
    Gilt für GUI genau so. Es gibt gefühlte 25 GUI Bibliotheken für C++, und die Möglichkeit mit dem OS direkt zu "sprechen". (Stichwort WinAPI). Mit jedem dieser Themen könnte man wahrscheinlich kleine Bücher füllen. Ich kann nur sagen, wenn man schon halbwegs programmieren kann, fällt es einem wesentlich leichter die anderen Dinge zu lernen, weil man nicht dauernd zwei Baustellen gleichzeitig hat. Sobald die Grundlagen drauf hat, kann man sich dazu auch gut Dinge im Internet zusammen suchen. Ein Buch brauchst du dazu nicht mal unbedingt. Das Internet bietet sehr gute Grundlagen. Man muss halt nur so viel Anfangserfahrung im Programmieren mitbringen, dass man die Spreu vom Weizen trennen - oder zumindest das Brauchbare aus dem Unbrauchbaren filtern kann.
    Wenn dir das allerdings alles zu kompliziert ist, du nur schnell mal etwas basteln möchtest und dich das was da drunter liegt gar nicht so sehr interessiert, guck dir vielleicht mal C#/Java an. Die bringen die nötigen Werkzeuge Out-Of-The-Box mit, und somit bekommt man damit auch schneller Ergebnisse. (In Java kann dir auch niemand vorwerfen unsigned nicht zu benutzen, das gibt's da nämlich gar nicht, ist wohl beim "Vereinfachen" rausgeflogen. :D)



  • Joa, rausgeflogen 🙂

    C#, Java vielleicht irgend wann mal, aber jetzt nicht. Ich will kein baukasten, wo ich mir Fenster und Funktionen "baue". Ich will schon richtig programmieren lernen. Ich weiss, das GUI und co komplexe Themen sind. Eigentlich hab ich auch nichts dagegen, ein seperates Buch zu holen. Ich dachte mir einfach nur, dass es besser ist, wenn man mit diesen Themen in einem einzigen Buch anfängt. So hat man dann einen besseren Übergang zwischen den einzelnen Themen, als wenn man dann mit nem neuen Buch anfängt. Kannst du mir aber kurz sagen, ob das Buch (C++ Prime oder so) auf deutsch ist?



  • Du lernst schon "richtig" Programmieren mit C#/Java, nur halt nicht ganz so low-level. Aber ich will dich bestimmt nicht zu diesen Sprachen drängen.
    Den C++ Primer gibt es sicherlich auch in deutscher Übersetzung, einfach mal bei Amazon & co gucken. Alternativ kann man natürlich auch gleich mit C anfangen, dann bekommt man wegen rohen Zeigern keinen auf den Deckel. 😉 Da wird glaube ich oft das hier empfohlen.

    PS: Es könnte sein, dass sich an dunklen Stellen des Internets pdf Dateien befinden, in die man mal kurz reinäugeln kann, bevor man ein Buch kauft, falls Amazon das nicht gleich selbst anbietet. 😉





  • Ich kenn's jetzt nicht, aber ich meine mich zu erinnern, dass es ganz okay erwähnt wurde hier. Aber schlaf einfach mal drüber, bis heute mittag gibt dir bestimmt jemand eine Bewertung dazu, und ob du jetzt oder dann bestellst macht wohl auch keinen Unterschied.



  • cooky451 schrieb:

    PS: Es könnte sein, dass sich an dunklen Stellen des Internets pdf Dateien befinden, in die man mal kurz reinäugeln kann, bevor man ein Buch kauft, falls Amazon das nicht gleich selbst anbietet. 😉

    Neeeeeeeeeee...
    is nich wahr!!! ECHT?

    Das hab ich ja garnicht gewusst!!! 😃 😃 😃 😃 😃



  • cooky451 schrieb:

    Ich kenn's jetzt nicht, aber ich meine mich zu erinnern, dass es ganz okay erwähnt wurde hier. Aber schlaf einfach mal drüber, bis heute mittag gibt dir bestimmt jemand eine Bewertung dazu, und ob du jetzt oder dann bestellst macht wohl auch keinen Unterschied.

    Also holen werde ich es evtl. aber Bestellen...??? 😃



  • für die lehrreiche Kommentierung im Quelltext. Viel Arbeit..., das bringt zumindest für Leute wie mich eine Menge.

    Pluto



  • nexti schrieb:

    Ist dir dieses Buch bekannt?

    http://www.amazon.de/-Programmierer-lernen-Professionell-anwenden-Lösungen/dp/3446426914/ref=sr_1_3?s=books&ie=UTF8&qid=1355462043&sr=1-3

    Ja, das Buchst ist wirklich gut. Habe es selbst gelesen. Kann es nur empfehlen.

    Pluto schrieb:

    für die lehrreiche Kommentierung im Quelltext. Viel Arbeit..., das bringt zumindest für Leute wie mich eine Menge.

    👍 Finde ich auch, sollte man öfters vorfinden. 🙂



  • Ich behaupte auch, dass der Konstruktor von Mensch fehlerhaft ist...da würde ich suchen...


Anmelden zum Antworten