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



  • 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.
    }



  • Erst einmal möchte ich allen Beteiligten meinen Dank für die vielen Antworten aussprechen.

    Also es ist nun wie folgt:

    In der Header - Datei "Klasse Person.h" habe ich folgenden Code stehen:

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

    In der CPP - Datei "Klasse Person" (ich weiß, dass die Namensgebung bisschen doof ist, aber mir ist nichts besseren eingefallen) habe ich folgenden Code stehen:

    #include <iostream>
    #include "Klasse Person.h"
    using namespace std;
    
    int main()
    {
      Person Passant;
    
      cout << "Wie ist Ihr Vorname?\n";
      cin  >> Passant.getVorname();
    
      cout << "Wie ist Ihr Nachname?\n";
      cin  >> Passant.getNachname();
    
      cout << "Welche Haarfarbe haben  Sie?\n";
      cin  >> Passant.getHaarfarbe();
    
      cout << "Welche Augenfarbe haben Sie?\n";
      cin  >> Passant.getHaarfarbe();
    
      cout << "Wie gross sind Sie?\n";
      cin  >> Passant.getGroeße;
    
      cout << "\n";
      cout << "Das haben Sie eingegeben:\n";
      cout << "\n";
      cout << "Vorname:    " << Passant.getVorname() << "\n";
      cout << "Nachname:   " << Passant.getNachname() << "\n";
      cout << "Haarfarbe:  " << Passant.getHaarfarbe() << "\n";
      cout << "Augenfarbe: " << Passant.getAugenfarbe() << "\n";
      cout << "Groesse:    " << Passant.getGroeße() << "\n";
    
      return 0;
    }
    

    Mein Compiler schluckt alles außer Zeile 22. Da ist bei mir der >> Operator rot unterringelt mit der Meldung

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

    Ich finde echt nicht den Fehler, da ich nicht weiß, was ich falsch gemacht habe...



  • 1. was ist denn getGroeße?
    2. warum heißt es nicht getGröße?



  • Belli schrieb:

    1. was ist denn getGroeße?
    2. warum heißt es nicht getGröße?

    Ich habe es halt so geschrieben... läuft doch auf das Gleiche hinaus...


Anmelden zum Antworten