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



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



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

    Hey Rewind... wie hast Du das gestern gemeint mit "Member sind aber trotzdem nicht initialisiert"?? Wie soll bzw. kann ich denn einen String initialisieren??



  • silent_max schrieb:

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

    Obwohl ich lieber anfangen würde englische Begriffe zu benutzen.

    getGroeße und getGröße sind immer noch Sonderzeichen.

    Besser wäre doch getHeight und setHeight 😉

    Für die Namengebung der Dateien, benutze keine Leerzeichen.

    Benutze am besten den Klassennamen für die Dateien,in deinem Fall wäre dies Person.h und Person.cpp.

    Initialisieren, kann sie mit der Initialisierungsliste

    Person::Person():Vorname(""),
                     Nachname(""),
                     Haarfarbe(""),
                     Augenfarbe(""),
                     groesse(0)
    {}
    


  • demonking schrieb:

    Person::Person():Vorname(""),
                     Nachname(""),
                     Haarfarbe(""),
                     Augenfarbe(""),
                     groesse(0)
    {}
    

    mach mal lieber:

    Person::Person():groesse(0){}
    


  • demonking schrieb:

    Initialisieren, kann sie mit der Initialisierungsliste

    Person::Person():Vorname(""),
                     Nachname(""),
                     Haarfarbe(""),
                     Augenfarbe(""),
                     groesse(0)
    {}
    

    Wo muss ich denn die Initialisierungsliste machen?? In der Header-Datei oder in CPP-Datei? Und wo? Nach dem Quellcode??

    Gruß

    Max



  • @silent_max

    1. Was ist diner Meinung nach zwischen diesen beiden Zeilen anders, so dass deine IDE das eine Unterkringelt, das andere Nicht?

    cin  >> Passant.getHaarfarbe();
      cin  >> Passant.getGroeße;
    

    was meinst du, was

    string getHaarfarbe()
    {
       return Haarfarbe;
    };
    

    macht?
    Also jetzt mal so ganz genau. Nicht nur so in etwa. Und dann erkläre mir, warum

    cin  >> Passant.getHaarfarbe();
    

    funktioniert


Anmelden zum Antworten