Neu in C++ (Getter/Setter) Methoden
-
Hallo Leute bin neu in der C++ Welt. Ich habe eine "einfache" Aufgabe bekommen (Flächen Berechnung) von verschiedenen Körpern.
Am besten poste ich mal den Code und erkläre es dann.
Meine main.cpp:#include "GeomObjektHeader.h" #include <iostream> using namespace std; int main(void) { int anzahl = 0; int eingabe = 0; char auswahl; double x; double y; GeomObjekt objekt; cout << "Anzahl der Objekte: "; cin >> anzahl; cout << endl; objekt.zeigeObjekte(); do { eingabe++; cout << endl; cout << eingabe << ". Objekt ist ein: "; cin >> auswahl; if(auswahl == 'p') objekt.setName("Punkt"); else if(auswahl == 'q') objekt.setName("Quadrat"); else if(auswahl == 'r') objekt.setName("Rechteck"); else if(auswahl == 'k') objekt.setName("Kreis"); //Hier versuche ich die Werte einzulesen und dann als setter zu setzen. //Aber wenn ich 2 oder mehr Objekte habe, dann gibt er immer nur das letzte //Objekt aus. cout << endl; cout << "X = "; cin >> x; cout << "Y = "; cin >> y; cout << endl; objekt.setXpos(x); objekt.setYpos(y); //Ich wüsste nicht, wie ich a und b einlesen sollte wenn ich ein Quadrat oder //Recht eingebe? Somit habe ich erstmal nichts berechnet. } while(eingabe < anzahl); eingabe = 0; cout << "Folgende Objekte wurden eingegeben:"; do { eingabe++; cout << endl; cout << eingabe << ". Objekt ist ein "; /*cout << objekt.getName; //Warnung: Größenkonflikt. Warum?? cout << ":"; cout << "P("; cout << objekt.getXpos; //Warnung: Größenkonflikt. Warum?? cout << ","; cout << objekt.getYpos; //Warnung: Größenkonflikt. Warum?? cout << ")";*/ objekt.ausgabe(); } while(eingabe < anzahl); cout << "\n\n"; return 0; }GeomObjekt.cpp:
#include "GeomObjektHeader.h" #include <iostream> #include <string> using namespace std; GeomObjekt::GeomObjekt() { xpos = 0; ypos = 0; } void GeomObjekt::zeigeObjekte() { cout << "Eingabe der Objekte" << endl; cout << " p - Punkt" << endl; cout << " q - Quadrat" << endl; cout << " r - Rechteck" << endl; cout << " k - Kreis" << endl; } void GeomObjekt::setzeWerte(int Xpos, int Ypos, char Name[10], char Color[10]) { xpos = Xpos; ypos = Ypos; strcpy(name, Name); strcpy(color, Color); } void GeomObjekt::zeigeWerte() { cout << endl; cout << name << endl; cout << " X = "<< xpos << endl; cout << " Y = "<< ypos << endl; } void GeomObjekt::ausgabe() { cout << name << ":" << " P(" << xpos << ", " << ypos << ")"; } double GeomObjekt::umfangBerechnung(double u) { U = 2 * u; return U; } double GeomObjekt::flaechenBerechnung(double a, double b) { A = a * b; return A; } /* Getter und Setter */ double GeomObjekt::getXpos() { return xpos; } void GeomObjekt::setXpos(double Xpos) { xpos = Xpos; } double GeomObjekt::getYpos() { return ypos; } void GeomObjekt::setYpos(double Ypos) { ypos = Ypos; } char GeomObjekt::getName() { return (char)name; //Bin mir nicht sicher ob ich das so machen sollte? } void GeomObjekt::setName(char Name[10]) { strcpy(name, Name); } char GeomObjekt::getColor() { return (char)color; //Hier genauso!? } void GeomObjekt::setColor(char Color[10]) { strcpy(color, Color); } double GeomObjekt::getU() { return U; } void GeomObjekt::setU(double u) { U = u; } double GeomObjekt::getA() { return A; } void GeomObjekt::setA(double a, double b) { A = a * b; }Zu den Getter/Setter mit den Namen/Color würde ich noch den Header posten wollen. Da soll ich eigentlich nur einen Namen und eine Farme speichern können. Ich habe das als char name[10] und char color[10] gemacht.
So etwa:Der Header:
#ifndef GEOMOBJEKT_H #define GEOMOBJEKT_H class GeomObjekt { public: GeomObjekt(); void setzeWerte(int, int, char Name[10], char Color[10]); void zeigeObjekte(); void zeigeWerte(); void ausgabe(); double umfangBerechnung(double); double flaechenBerechnung(double, double); double getXpos(); void setXpos(double); double getYpos(); void setYpos(double); char getName(); void setName(char Name[10]); char getColor(); void setColor(char Color[10]); double getU(); void setU(double); double getA(); void setA(double, double); private: double xpos; double ypos; char name[10]; //Wollte hier nur einen Namen speichern. char color[10];//Und hier eine Farbe. double U; double A; }; #endifProblem:
Der Benutzer kriegt die abfrage, wieviele Objekte er eingeben möchte. Dann werden die Objekte angezeigt (Punkt p, Quadrat q, Rechteck r, Kreis k -> siehe void GeomObjekt::zeigeObjekte() in der GeomObjekt.cpp). Dann wählt er aus. Und anschließend soll alles berechnet werden (Umfang und Fläche) und ausgegeben werden.
Ich kriege es nicht hin, dass ich 2 Objekte eingeben kann. Irgendwie überschreibe ich es immer und gebe das letzte eingegebene wieder aus(siehe Kommentar in main.cpp).
-------------------------------------
Ausgabe in so etwa:
Anzahl der Objekte: 2Eingabe der Objekte
p - Punkt
q - Quadrat
r - Rechteck
k - Kreis1.Objekt ist ein: p (das ist die Eingabe: p)
Punkt
X = 1(Koordinate eingeben)
Y = 3(Koordinate eingeben)2.Objekt ist ein: q
Quadrat
X = 1(Koordinate eingeben)
Y = 4(Koordinate eingeben)
a = 2Folgende Objekte wurden eingegeben:
1. Objekt ist ein Punkt: P(1,3)
U = 0
A = 0 (Punkt hat ja keine Fläche/Umfang)
2. Objekt ist ein Quadrat: P(1,4)
U = 8 (da a=2 war U=4a)
A = 4 (A=aa)
---------------------------------------------Tut mir sehr leid, dass es zu lang geworden ist, aber ich dachte es ist besser, wenn ich euch alles zeige, damit ihr dann ein "Überblick" habt.
Hoffe ihr könnt mir helfen!
Fasse kurz zusammen:
- Kann nicht mehr als 2 Objekte einlesen.
- Es wird immer nur das letzte Objekt ausgegeben
- Wüsste auch nicht wie ich a oder b für Quadrat/Rechteck einlesen soll
- Darum habe ich noch nichts berechnet(Sorry nochmal für den langen code)
Gruß
Manda
-
Hallo,
die main.cpp hätte völlig gereicht, denn schon dort sieht man warum es nicht geht. Du hast nur ein Objekt der Klasse GeomObjekt und schreibst immer wieder neue Daten rein. Das Stichwort wäre hier Array oder um es gleich mit dem Standard zu machen der hierfür geeignet wäre. std::vector
http://www.cplusplus.com/reference/stl/vector/Dann das hier:
/*cout << objekt.getName; //Warnung: Größenkonflikt. Warum?? cout << ":"; cout << "P("; cout << objekt.getXpos; //Warnung: Größenkonflikt. Warum?? cout << ","; cout << objekt.getYpos; //Warnung: Größenkonflikt. Warum??Was auch immer das mit dem Größenkonflikt soll, da fehlen Klammern hinter den Funktionsnamen.
Ansonsten wäre anzuraten für die Namen und Farben std::string zu nehmen, dann bekommst du auch kein Problem wenn Name oder Farbe > 9 Zeichen ist.
#edit: Ups überlesen...
Mit der Ausgabe ist es genau das gleiche wie mit der Eingabe, du brauchst mehrere Objekte die du durchlaufen musst.
-
Hallo blub²,
wie könnte ich denn sagen, wenn ich z.b 3 Objekte eingeben möchte, dass er auch 3 Objekte dann erstellt?
Also so etwa:
Anzahl der Objekte: 3Ich erstelle ja ein Objekt, wie du gesagt hast:
GeomObjekt objekt;Wie könnte ich denn anhand der abfrage die Objekte erstellen? Würde er nicht immer nur eins erstellen?
Oder gibt es eine Möglichkeit objekt1, objekt2 usw. zu erstellen?
-
Entweder du legst dir ein Array auf Vorrat an:
GeomObjekt objekte[1000];
was ich aber für nicht so sinnvoll halte.Besser wäre der bereits gepostete std::vector. Damit könntest du einfach sowas machen:
std::vector<GeomObjekt> objekte; cin >> anzahl; objekte.resize(anzahl);Kuck dir doch mal den geposteten Link an.
-
Den Link habe ich mir angeguckt. Aber irgendwie gibt er mir jetzt Fehler aus.
cout << "Anzahl der Objekte: "; std::vector<GeomObjekt> objekt; cin >> anzahl; objekt.resize(anzahl); objekt.zeigeObjekte();//Fehler: zeigeObjekte() ist kein Element von VectorWas ich nicht ganz verstanden habe: Hätte ich jetzt mehrere Objekte zur Verfügung um auf die anderen Methoden zuzugreifen?
Also sowas bsp.: objekt1.setName("Punkt") oder wäre es immer das selbe Objekt das auf die Methoden zugreift?
Irgendwie fehlt mir da der durchblick.Wäre es nicht einfach sowas zu versuchen (dann verstehe ich das vielleicht etwas besser
)cout << "Anzahl der Objekte: "; cin >> anzahl; cout << endl; for(int i=0; i<=anzahl; i++) { //Könnte ich hiermit auch mehrere Objekte erstellen? GeomObjekt objekt[i]; }
-
MandaJohn schrieb:
Wäre es nicht einfach sowas zu versuchen (dann verstehe ich das vielleicht etwas besser
)cout << "Anzahl der Objekte: "; cin >> anzahl; cout << endl; for(int i=0; i<=anzahl; i++) { //Könnte ich hiermit auch mehrere Objekte erstellen? GeomObjekt objekt[i]; }Uargh. Stichwort Scopes, das geht völlig schief noch dazu kannst du Arrays nur mit statischen "Anzahlen" anlegen. Tipp: kuck dir erstmal Arrays richtig an.
-
So, habe es mir einfacher gemacht. Ich nehme einfach maximal 5 Objekte (für den Anfang). Bis es läuft, dann kann man es ja noch ändern.
GeomObjekt objekt[5]; cout << "Anzahl der Objekte: "; cin >> anzahl; cout << endl; do { eingabe++; cout << endl; cout << eingabe << ". Objekt ist ein: "; cin >> auswahl; if(auswahl == 'p') { objekt[1].setName("Punkt"); cout << "Punkt" <<endl; cout << "X = "; cin >> x; cout << "Y = "; cin >> y; cout << endl; objekt[1].setXpos(x); objekt[1].setYpos(y); } else if(auswahl == 'q') { objekt[2].setName("Quadrat"); cout << "Quadrat" << endl; cout << "X = "; cin >> x; cout << "Y = "; cin >> y; cout << "a = "; cin >> a; cout << "b = "; cin >> b; //Wieso komme ich hier nicht hin? Kann nichts für b eingeben. cout << endl; objekt[2].setXpos(x); objekt[2].setYpos(y); objekt[2].setA(a); objekt[2].setB(b); } else if(auswahl == 'r') objekt[3].setName("Rechteck"); else if(auswahl == 'k') objekt[4].setName("Kreis"); } while(eingabe < anzahl);Habe erstmal für p und q die Werte gesetzt. Das scheint auch zu klappen. Nur habe ich gerade Probleme bei der Ausgabe. Die sieht etwa so aus:
for(int i=0; i<5; i++) { eingabe++; cout << endl; cout << eingabe << ". Objekt ist ein "; cout << objekt[i].getName(); cout << ":"; cout << "P("; cout << objekt[i].getXpos(); cout << ","; cout << objekt[i].getYpos(); cout << ")"; }Erstmal will ich nur die Punkte ausgeben. Stimmt etwas mit der for-schleife nicht? Irgendwie gibt er nicht das aus was ich eingegeben habe

-
Könnte mir jemand bei der Ausgabe helfen?
if(auswahl == 'p') { objekt[1].setName("Punkt"); cout << "Punkt" <<endl; cout << "X = "; cin >> x; cout << "Y = "; cin >> y; cout << endl; objekt[1].setXpos(x); objekt[1].setYpos(y); U = objekt[1].umfangBerechnung(0); objekt[1].setU(U); A = objekt[1].flaechenBerechnung(a, b); objekt[1].setAFlaeche(A); } else if(auswahl == 'q') { objekt[2].setName("Quadrat"); cout << "Quadrat" << endl; cout << "X = "; cin >> x; cout << "Y = "; cin >> y; cout << "a = "; cin >> a; cout << "b = "; cin >> b; cout << endl; objekt[2].setXpos(x); objekt[2].setYpos(y); objekt[2].setA(a); objekt[2].setB(b); U = objekt[2].umfangBerechnung(a); objekt[2].setU(U); A = objekt[2].flaechenBerechnung(a, b); objekt[2].setAFlaeche(A); }Ich kriege die Ausgabe nicht hin. Er gibt die x,y Koordinaten richtig aus. Der Name ist was völlig anderes. Der Umfang und die Fläche ist auch korrekt.
(Außer erstmal für Kreis und Rechteck, aber das kommt später)Im Header sieht das für Namen so aus:
private: double xpos; double ypos; char name[10]; char color[10];Der Getter/Setter dafür:
char GeomObjekt::getName() { return (char)name; //Ist das casten hier ok?? } void GeomObjekt::setName(char Name[10]) { strcpy(name, Name); }Das ist die Ausgabe:
for(int i=1; i<5; i++) { eingabe++; cout << endl; cout << eingabe << ". Objekt ist ein "; cout << objekt[i].getName(); cout << ":"; cout << "P("; cout << objekt[i].getXpos(); cout << ","; cout << objekt[i].getYpos(); cout << ")" << endl; cout << "U = " << objekt[i].getU() << endl; cout << "A = " << objekt[i].getAFlaeche() << endl; }Folgende Objekte wurden eingegeben:
1. Objekt ist ein 4:P(1,3) //Hier fehlen überall die Namen?!?!
U = 0
A = 02. Objekt ist ein |:P(3,4)
U = 8
A = 63. Objekt ist ein ─:P(0,0)
U = -9.25596e+061
A = -9.25596e+0614. Objekt ist ein
:P(0,0)
U = -9.25596e+061
A = -9.25596e+061Habt ihr Tips für mich??
Danke schonmal!
GrußManda
-
char GeomObjekt::getName() { return (char)name; //Ist das casten hier ok?? }Nein, ist nicht OK. Du castest da einen Zeiger auf ein Array von char zu einem char. Benutz am besten ein std::string für namen und co.
Oder zumindest für die Rückgabe.std::string GeomObjekt::getName() { return std::string ( name );
-
Danke für die Antwort. Ich bekomme allerdings einen Fehler, muss ich dafür eine Bibliothek einbinden?
Müsste ich auch meine Variable: char name[10] umändern? in ein string?
-
MandaJohn schrieb:
Danke für die Antwort. Ich bekomme allerdings einen Fehler, muss ich dafür eine Bibliothek einbinden?
Du musst:
#include <string>noch anfügen.
Müsste ich auch meine Variable: char name[10] umändern? in ein string?
Ja, am besten wäre es.
-
Ah Super Danke, jetzt läufts auch. Hat eine Ketten reaktion ausgelöst, weil ich überall char name[10] hatte.
Gruß
Manda