Erstes OOP Projekt - Erschaffung einer Instanz namens Person - gelöst
-
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
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) {}