Erstes OOP Projekt - Erschaffung einer Instanz namens Person - gelöst



  • Skym0sh0 schrieb:

    Ich finde es eh immer verwerflich, wenn man als Programmieranfänger mit allen Sachen auf einmal zugebombt wird, man kann fast nichts richtig machen (in den Augen eingier hier im Forum).

    Ist das eine alggemeine Aussage oder bezieht sich das auf Max? Beim Letzteren würde das nicht stimmen, da unser Bildungssystem noch nicht so schlecht ist, dass alles in der ersten Vorlesungssitzung/Unterrichtsstunde drankommt. Normalerweise hat man eine Woche Zeit um das Gelernte aufzunehmen, zu üben und zu wiederholen. Jemand, der das wirklich lernen will, schaut noch über den Tellerrand hinaus und nimmt sich die zwei Stunden Zeit zusätzlich, um mehr zu machen als in der Aufgabe verlangt ist. Das ist aber alles schon ein anderes Thema. Fakt ist für mich, dass der Threadersteller zuerst ein paar Sachen nachholen muss, wenn er das lernen will.



  • Nein, das bezieht sich nicht auf Max oder indirekt auf ihn, sondern auf generell Anfänger.

    Es geht mir eher um die Informationsflut, die hier im Forum auf Anfänger einprasselt und abverlangt wird.

    Als ich damals angefangen habe mit C++ (vorher kannte ich ein klein bisschen Java), waren Arrays auch nur das was ich heute als C-Arrays kenne. An Vector und Konsorten hab ich damals nichtmals mein Zunkunfts-Ich denken lassen. Aber wenn hier im Forum jemand eine Frage stellt wird er sofort (unabhängig von seinem Skill) an den vector verwiesen. Das Ganze gibt es natürlich auch mit Zeigern und Smart-Pointern und auch im Klassendesign Bereich.

    C++ ist eine Sprache, die viele Eigenarten hat (positive wie negative) anhand derer man sich ziemlich verrennen kann im Entwicklungs- und Lernzyklus.
    Ich denke, es muss nicht immer die perfekte C++-Lösung verlangt oder dann gepostet werden, sondern eventuell auch eine die etwas C-lastiger ist.

    Denn absprechen kann das keiner, Fehlermeldungen was Templates angeht sind alles andere als gut zu verstehen (jedenfalls anfangs).



  • Als ich damals angefangen habe mit C++ (vorher kannte ich ein klein bisschen Java), waren Arrays auch nur das was ich heute als C-Arrays kenne. An Vector und Konsorten hab ich damals nichtmals mein Zunkunfts-Ich denken lassen. Aber wenn hier im Forum jemand eine Frage stellt wird er sofort (unabhängig von seinem Skill) an den vector verwiesen. Das Ganze gibt es natürlich auch mit Zeigern und Smart-Pointern und auch im Klassendesign Bereich.

    C++ ist eine Sprache, die viele Eigenarten hat (positive wie negative) anhand derer man sich ziemlich verrennen kann im Entwicklungs- und Lernzyklus.
    Ich denke, es muss nicht immer die perfekte C++-Lösung verlangt oder dann gepostet werden, sondern eventuell auch eine die etwas C-lastiger ist.

    Naja, wenn wer Frage ohne Context stellt, gehen wir davon aus, das es sich um ein praktisches Problem handelt! Und in der Praxis kommst du um "Intelligente Container" nicht herum. Wenn wer z.B. in produktiven Einsatz ohne triftigen Grund nen c Style Array nem Vector vorzieht, gehoert er ..... und es gibt nicht viele wirklich triftige Gründe !
    Leider richtet sich die Form der Bestrafung auch nach der Verfügbarkeit und vor allem den Kosten geschulten Personals 😃

    Geht es um das lernen / theorethische Probleme, dann wird das meistens auch deutlich gemacht. Und trozdem ist der hinweis dann immer noch angebracht, denn trotz allen gelernten soll der Weg auch in die richtige Richtung gehen oder ?

    C-lastiger Code ist toll 🙂
    Mann will ihn nur nicht warten müssen ...
    Muss man trotzdem welchen schreiben in der Praxis, sollt man sich um Gotteswillen dessen bewusst sein (und es nur auf die notwendigen Teile berschränken).
    Das sollt eine unserer Kerntätigkeiten sein als Programmierer, abwägen zwischen Wartbarkeit und Performance!

    Wie man mit den Antworten hier umgeht ist jedem seine Sache. Nur sollt man sich auch klar machen, für was dieses Forum gut sein soll !?
    Ist dieses Forum zum disskutieren von praktischen Problemstellungen, oder eher nen interaktives Nachschlagewerk, wo man Anfängern das Selbsstudium der Theorie abnimmt ... err erleichtert.

    Ich selber sehe den praktischen Teil im Vordergrund, also sehe ich auch keinen Grund Verweisse auf die praktische Anwendungen zurueckzuhalten ....

    Genauso gehe ich zuerst davon aus, das der durchschnittliche Forenuser zumindest die Grundlagen beherrscht. Sonst müssten hier alle in nem ganz anderen Stil schreiben ....

    Das heisst nich, das Neulinge keine Fragen stellen dürfen/sollten, nur sind Verweisse auf Literatur und Grundlagen ausm Lehrbuch dann auch angebracht.

    Ciao ...



  • daddy_felix schrieb:

    OOP ist leider jetzt das aktuelle Thema in seinem Kurs. Max ist daher dazu gezwungen, sich jetzt damit auseinanderzusetzen,

    Also ich kann mich daddy_felix nur anschließen.

    Mein Dozent nimmt leider keine Rücksicht darauf, was die Schüler denken und schreitet immer und immer mehr voran mit dem Unterrichtsstoff. Zwar geht er auf ein oder zwei Fragen während des Unterrichts drauf ein, aber das war es auch schon.

    Und OOP ist nun mal nun groß Thema.

    Anbei ... bei mir hat es jetzt angefangen, dass neben der CPP Programmierung zusätzlich zwei Stunden in der Woche Netzwerktechnik dazu kommen.

    Weiß einer von euch ein gutes Forum, das sich mit Netzwerktechnik behandelt??

    Gruß Max



  • silent_max schrieb:

    Mein Dozent nimmt leider keine Rücksicht darauf, was die Schüler denken...

    Wenn ein Lehrer auf jeden und alles eingeht, so wird der Unterricht immer an den schlechtesten in der Klasse orientiert. Das andere Extrem ist zwar auch nicht gut, aber in der Regel wird ein Mittelweg eingeschlagen. Er muss eine Gewisse Stoffmenge in einer gewissen Zeit durchziehen, die Stoffmenge ist nicht frei von ihm vorgegeben.

    Wenn du aber den Begriff Dozent nennst, gehe ich schon von einer weiterführenden Schule oder einem Studium aus. In dem Fall wird von einem Erwartet, das er in der Lage ist sich Informationen auch anderweitig aneignen zu können. Zudem kann man Klassenkameraden durchaus fragen oder mit diesen lernen.

    silent_max schrieb:

    Weiß einer von euch ein gutes Forum, das sich mit Netzwerktechnik behandelt??

    Nein, aber die Bücher für Fachinformatiker sollen einen guten Überblick geben (Über die Qualität kann ich nicht viel sagen, aber schau dir mal das OpenBook von Galileo an, ob du da fündig wirst [Wird nach meinem Wissen von einigen Fachinformatier-Klassen verwendet]).



  • asc schrieb:

    [Wird nach meinem Wissen von einigen Fachinformatier-Klassen verwendet]).

    Ich mache meinen staatlich geprüften Elektrotechniker und nicht Informatiktechnik...



  • Hey Leute ... ich habe auf einmal voll die Blockade...

    Ich wollte das Projekt ganz neu aufrollen und habe es nun wie folgt gemacht:

    In der Header-Datei namens "Klasse Person" habe ich folgendes geschrieben:

    #include <iostream>
    using namespace std;
    
    class Person
    {
    private:
    	string Vorname;
    	string Nachname;
    	int Geburtsdatum;
    	string Haarfarbe;
    	string Augenfarbe;
    	int Größe;
    };
    

    Wie gesagt ... ich habe gerade voll die Blockade...

    Und nun zu meinen Fragen:
    1.) Wie muss da der Konstruktor aussehen? Wie der Destruktor aussehen muss, kann ich mir ungefähr vorstellen ... Eben der Konstruktor mit einer Tilde davor...
    2.) Welche Methoden kann bzw. muss ich denn wie als public deklarieren, um auf die als private deklarierten Variablen zugreifen zu können??



  • silent_max schrieb:

    In der Header-Datei namens "Klasse Person" habe ich folgendes geschrieben:

    1. NIEMALS "using namespace" im Header!
    2. Ein wenig Lesen oder google-Suche sollte auch dir möglich sein. "C++ Construktor" wird definitiv treffer Liefern. Konstruktor und Destruktor heißen exakt wie die Klasse und es gibt keine Rückgabewerte (Sonst wie jede andere Methode). Ein Destruktor wird diese Klasse wohl kaum benötigen.
    3. Geburtsdatum als int? (Ich hoffe du hast eine sinnvolle Umrechnung, intern arbeiten viele Datumsdarstellungen als Integer, oder mit Zeitanteil auch double, das wird für dich aber wohl eher nocht nichts sein; Eher wäre hier ein eigener Typ mit Tag, Monat, Jahr wohl "leichter").
    4. Im Klassischen Fall für jede Variable ein Getter und ein Setter. Wie steht doch im Thread.



  • silent_max schrieb:

    1.) Wie muss da der Konstruktor aussehen? Wie der Destruktor aussehen muss, kann ich mir ungefähr vorstellen ... Eben der Konstruktor mit einer Tilde davor...

    class Person:
    {
        //...
    public:
        Person (string vName, string nName, int gebDatum, string hFarbe, string augFarbe, int gr);
    };
    
    //deine cpp:
    Person::Person (string vName, string nName, int gebDatum, string hFarbe, string augFarbe, int gr):
        Vorname (vName), Nachname (nName), Geburtsdatum (gebDatum), Haarfarbe (hFarbe), Augenfarbe (augFarbe), Größe (gr)
        {
            //...
        }
    

    silent_max schrieb:

    2.) Welche Methoden kann bzw. muss ich denn wie als public deklarieren, um auf die als private deklarierten Variablen zugreifen zu können??

    Alle Methoden haben grundsätzlich Zugriff auf alle Membervariablen - und zwar unabhängig davon, ob sie als privat oder public deklariert wurden. Welche Methoden du als public deklarierst und welche als private, hängt ganz vom Kontext ab (wenn die Methode von anderen Klassen nicht verwendet wird bzw. verwendet werden darf, deklarierst du sie als private). Wenn du die Werte "von außen" ändern willst, nimmst du setter/getter.



  • [Rewind] schrieb:

    class Person:
    {
        //...
    public:
        Person (string vName, string nName, int gebDatum, string hFarbe, string augFarbe, int gr);
    };
    
    //deine cpp:
    Person::Person (string vName, string nName, int gebDatum, string hFarbe, string augFarbe, int gr):
        Vorname (vName), Nachname (nName), Geburtsdatum (gebDatum), Haarfarbe (hFarbe), Augenfarbe (augFarbe), Größe (gr)
        {
            //...
        }
    

    Wenn du die Werte "von außen" ändern willst, nimmst du setter/getter.

    Warum deklarierst Du die Variablen, die ich als private deklariert habe, als public? Was meinst Du mit "setter" und "getter"? Sind das Datentypen?



  • Er hat sie nicht public, sondern der Konstruktor ist public.
    Und Setter/Getter sind Funktionen, die es ermöglichen auf die Daten von außen zuzugreifen:

    class Person
    {
      // Variablen, private
    
    public:
        // Konstruktor
    
        // Beispiel-Setter für Vorname
        void setVorname(string vorname)
        {
            Vorname = vorname;
        }
    
        // Beispiel-Getter für Vorname
        string getVorname()
        {
            return Vorname;
        }
    };
    


  • Wo hat er denn die Variablen public gemacht? Er hat einen Konstruktor geschrieben, der deine Variablen per Intialisierungsliste auf die an ihn ueber Parameter uebergegeben Werte setzt. Nirgednwo hat er was public gemacht (ausser halt den Konstruktor). Die Klasse ist auch unvollstaendig, deswegen das //... , dass du noch durch die Variablen-Deklarationen in deiner Klasse ersetzen muesstest.



  • Nathan schrieb:

    Er hat sie nicht public, sondern der Konstruktor ist public.
    Und Setter/Getter sind Funktionen, die es ermöglichen auf die Daten von außen zuzugreifen:

    class Person
    {
      // Variablen, private
    
    public:
        // Konstruktor
        
        // Beispiel-Setter für Vorname
        void setVorname(string vorname)
        {
            Vorname = vorname;
        }
        
        // Beispiel-Getter für Vorname
        string getVorname()
        {
            return Vorname;
        }
    };
    

    Sorry, dass ich so blöd frage ... aber wo ist der Unterschied zwischen setVorname und getVorname ??



  • setVorname weist deinem "Vornamen" einen neuen namen zu und getVorname gibt den aktuellen "Vornamen" zurück. Getter und Setter eben 😃



  • Ist denn folgende Klassendeklaration korrekt??

    class Person
    {
    private:
    	string Vorname;
    	string Nachname;
    	string Haarfarbe;
    	string Augenfarbe;
    	int Größe;
    public:
    	Person();
    	~Person();
    	string getVorname()
    	{
    		return Vorname;
    	};
    	string getNachname()
    	{
    		return Nachname;
    	}
    	string getHaarfarbe()
    	{
    		return Haarfarbe;
    	}
    	string getAugenfarbe()
    	{
    		return Augenfarbe;
    	}
    	int Größe()
    	{
    		return Größe;
    	}
    
    };
    


  • Du hast schon mal das Prinzip von Gettern verstanden (vllt. sogar auch von Settern). Deine Member sind aber trotzdem nicht initialisiert (zumindest nicht über die Initialisierungsliste, die mehr als empfehlenswert ist). Noch ein Tipp: meide Sonderzeichen wie Umlaute in Namen deiner Variablen, Funktionen, etc.



  • [Rewind] schrieb:

    Du hast schon mal das Prinzip von Gettern verstanden (vllt. sogar auch von Settern). Deine Member sind aber trotzdem nicht initialisiert (zumindest nicht über die Initialisierungsliste, die mehr als empfehlenswert ist). Noch ein Tipp: meide Sonderzeichen wie Umlaute in Namen deiner Variablen, Funktionen, etc.

    Mit "Member" meinst Du die Variablen (bzw. die Attribute)??



  • Ja, Attribute.



  • Eine kleine Frage hätte ich dennoch noch zur CPP Datei...

    Wenn ich jetzt folgendes Schreibe

    #include <iostream>
    #include "Klasse Person.h"
    using namespace std;
    
    int main()
    {
    	cout << "Wie ist ihr Vorname?";
    	cin  >> Person.getVorname;
    
    	return 0;
    }
    

    dann bekomme in Zeile 8 ich die Meldung

    Error: Kein ">>"-Operator stimmt mit diesen Operanden überein
    

    Muss ich in Zeile 7 noch z.Bsp. Person Passant schreiben?



  • Du machst mehrere Fehler:
    1. includen musst du deine Klasse "Person.h" nicht "Klasse Person.h"
    2. du verwendest getVorname falsch
    3. Du must zuerst ein Objekt deiner klasse Person erstellen.

    Code:

    [code="cpp"]
    #include <iostream>
    #include <string>
    #include Person.h"

    int main()
    {
    Person my_person_object; //hier das Objekt erstellen (mit Standardkonstruktor)
    std::cout << "wie soll ihre Person heissen?"
    std::string name;
    std::cin >> name;
    my_person_object.setVorname( name );
    std::cout << "ahhh, hallo " << my_person_object.getVorname();
    //usw.
    }


Anmelden zum Antworten