Erstes OOP Projekt - Erschaffung einer Instanz namens Person - gelöst
-
[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
publicgemacht? Er hat einen Konstruktor geschrieben, der deine Variablen per Intialisierungsliste auf die an ihn ueber Parameter uebergegeben Werte setzt. Nirgednwo hat er waspublicgemacht (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
setVornameundgetVorname??
-
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 übereinMuss ich in Zeile 7 noch z.Bsp.
Person Passantschreiben?
-
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 übereinIch 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
-
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, warumcin >> Passant.getHaarfarbe();funktioniert
-
otze schrieb:
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.