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



  • 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



  • otze schrieb:

    @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;
    

    Ja die beiden Klammern fehlen. Sorry, habe ich nicht (mehr) gesehen. Das blöde ist nur, dass der >> Operand immer noch rot unterringelt ist.

    otze schrieb:

    was meinst du, was

    string getHaarfarbe()
    {
       return Haarfarbe;
    };
    

    macht?
    Also jetzt mal so ganz genau. Nicht nur so in etwa.

    Die als string deklarierte Methode gibt einen string zurück würde ich jetzt mal sagen.

    otze schrieb:

    Und dann erkläre mir, warum

    cin  >> Passant.getHaarfarbe();
    

    funktioniert

    Da hast Du mich auf dem falschen Fuß erwischt, ich kann es nicht erklären.



  • Da musst Du Dich nicht wundern, es funktioniert nämlich nicht ...



  • Es funktioniert nicht, das stimmt, aber es kompiliert. Und warum kompiliert es?



  • Mit dem Getter erhälst du eine temporäre Kopie des String-Objekts (d.h. des Attributs), wo der aus dem Stream extrahierte Wert landet. Da aber das Objekt und damit auch die Eingabe gleich danach zerstört werden, ändert sich innerhalb deines Objektes nichts. Max, lies doch bitte was über Setter nach. ⚠



  • [Rewind] schrieb:

    Da aber das Objekt und damit auch die Eingabe gleich danach zerstört werden, ändert sich innerhalb deines Objektes nichts.

    Nein, es ändert sich innerhalb des Objekts nichts, weil das Innere des Objekts überhaupt nicht (verändernd) angesprochen wird.


Anmelden zum Antworten