Ist das die Lösung zur Aufgabe??
-
Ich habe folgende Aufgabenstellung:
Geometrische Objekte seien generell durch einen Punkt (x,y) in der kartesischen Ebene charakterisiert, der die Lage des Objekts kennzeichnet. Bei
Rechtecken soll dies immer die linke untere Ecke sein.
Entwickeln Sie eine C++Klasse GeoObjekt , die als charakteristische Größe
einen Punkt für die Lage enthält, wobei der Punkt als Struktur realisiert werden soll. Die Koordinaten sollen als float Zahlen realisiert sein. Zusätzlich
soll ein DefaultKonstruktor vorhanden sein, der die Koordinaten als Parameter übergeben bekommt und mit 0 vorbelegt.
Leiten Sie aus der Klasse GeoObjekt eine Klasse Rechteck für Rechtecke ab, die als weitere Elemente die Länge sowie die Breite des Rechtecks als floatZahlen enthält.
Für die Klasse Rechteck soll ein Default Konstruktor realisiert werden,
der den DefaultKonstruktor von GeoObjekt verwendet und zusätzlich die
Länge und Breite mit Hilfe einer Parameterübergabe initialisiert, wobei je
weils 0 als DefaultWert verwendet werden soll.
Weiterhin soll die Klasse Rechteck eine Methode float berechneFlaeche()
enthalten, die den Flächeninhalt des Rechtecks ermittelt und als Wert zurück
liefert.
Schreiben Sie ein Hauptprogramm, das ein Rechteck anlegt, dessen Länge und
Breite vom Benutzer eingegeben worden sind. Anschließend soll der Flächeninhalt berechnet und auf dem Bilschirm ausgedruckt werden.und dazu hab ich nun den folgenden Code geschrieben. Mir wird auch der Flächeninhalt berechnet aber ist das trotzdem die Lösung zu dieser Aufgabe oder fehlt da etwas oder ist da was falsch gemacht?
Das man es vielleicht einfacher und besser machen kann, das kann gut sein.
#include <iostream> using namespace std; struct Punkt { float x; float y; }; class geoObjekt { public: geoObjekt(); ~geoObjekt(); punktbestimmen(); punktausgeben(); private: Punkt x; }; geoObjekt::geoObjekt() { x.x = 0; x.y = 0; }; geoObjekt::~geoObjekt() {}; geoObjekt::punktausgeben() { cout << "X-Koordinate: " << x.x << endl; cout << "Y-Koordinate: " << x.y << endl; }; geoObjekt::punktbestimmen() { cout << "Geben Sie die X-Koordinate an: "; cin >> x.x; cout << "Geben Sie die Y-Koordinate an: "; cin >> x.y; }; // Klasse Rechteck class Rechteck:public geoObjekt { public: Rechteck(); ~Rechteck(); laengebestimmen(); laengeausgabe(); float berechneFlaeche(); private: float laenge; float breite; }; //Methoden Rechteck Rechteck::Rechteck() { geoObjekt(); laenge = 0; breite = 0; }; Rechteck::~Rechteck() {}; Rechteck::laengebestimmen() { cout << "Geben Sie die Länge ein: "; cin >> laenge; cout << "Geben Sie die Breite ein: "; cin >> breite; // punktbestimmen(); }; /*Rechteck::laengeausgabe() { cout << "Länge: " << laenge << endl; cout << "Breite: " << breite << endl; };*/ float Rechteck::berechneFlaeche() { float flaeche; flaeche=laenge*breite; return flaeche; }; int main() { geoObjekt x; Rechteck a; a.laengebestimmen(); float flaeche; flaeche = a.berechneFlaeche(); cout << "Die Fläche des Rechteckes ist: " << flaeche << endl; return 0; }
-
Hast du das versucht zu kompilieren? Das sollte nicht klappen.
Die meisten Methoden haben bei dir keine Rückgabewerte. Ein void wird es tun. Konstruktoren und Destruktoren haben keinen Rückgabewert, aber deine anderen Methoden sollten schon einen haben.
Die Konstruktoren für Punkt und GeoObjekt entsprechen nicht der Aufgabenstellung.
-
Hi,
danke für deine Antwort.
Ja ich habe es kompiliert und es funktioniert. Ich nehme mal an das wenn kein Rückgabewert angegeben ist dann wird einfach void angenommen aber das werde ich mir merken dass es immer dabei stehen sollte.
bei dem Konstruktor von geoObjekt soll man ja die Koordinaten von dem Punkt übergeben aber das habe ich nicht hinbekommen. Compiler sagte immer etwas von kein default Konstruktor vorhanden.
Wie muss ich das machen?
Punkt ist doch eine Struktur und daher kann sie doch gar keine Konstruktor haben oder?
Entspricht wenigstens der Rest der Aufgabenstellung? Also wieviel von 15 Punkten hätte ich dafür wohl bekommen? Ich hoff mal 10 sonst bin ich ganz betrübt
-
Sagen wir mal 8 Punkte.
1. Wenn dein Compiler das akzeptiert ohne den Rückgabewert, ist das kein C++ Compiler und taugt nichts.
2. struct ist genauso wie class, nur die Elemente sind standardmäßig public und nicht private. Deshalb kann ein struct auch Konstructoren haben.
3. Man kann den Argumenten einer Funktion Defaultwerte geben. Zum Beispiel
void setValue(int val = 12) { }
Das kannst du dann auf die Konstruktoren transferieren.
-
schreibt man das eigentlich hin, wenn es kein delete gibt?
ne nee? aber die profs verlangen es glaub oder?hier das hier
Rechteck::~Rechteck() {};
-
ist ziemlich sinnlos einen dtor hinzuschreiben wenn man keine dynamischen attribute wieder freigeben muss
-
Der Punkt im GeoObjekt hat einen denkbar ungünstigen Namen. Das ist nicht wirklich schön.
Außerdem sollte doch Point nen Konstruktor haben, dann entfällt nämlich auch das auf 0 setzen im Konstruktor von GeoObjekt.
Achja, die Zeile GeoObjekt(); im Konstruktor von Rechteck tut nicht wirklich das was Du denkst. Eigentlich möchtest Du ja den Konstruktor Deiner Basisklasse aufrufen, richtig? Das tust Du aber nicht, weil Du das nur in der Initialisierungsliste erledigen kannst.
Rechteck::Rechteck() : GeoObjekt() { // ... restlicher Code }
Wobei das sowieso unsinnig ist, wenn es keine Parameter gibt, der wird nämlich automatisch aufgerufen.
Die Zeile GeoObjekt(); in Deinem Code erzeugt jedenfalls ein temporäres GeoObjekt das auch gleich wieder zerstört wird. Bringt also nicht wirklich was.
Der Destruktor sollte bei dieser Klasse meines erachtens virtual sein (und am besten gleich noch rein virtuell, dann gibt der Aufruf GeoObjekt(); auch nen Compiler-Fehler ;)). Denn so eine Basisklasse schreit geradezu danach auch polymorph benutzt zu werden. Aber gut, das geht dann vielleicht etwas über die Aufgabe hinaus.
MfG Jester
-
Servus,
so wie ich die Aufgabenstellung verstehe sollten die Konstruktoren so aussehen:
. . . GeoObjekt(float v=0.0, float h=0.0):x.y(v), x.x(h) {} . . . Rechteck(float v=0.0, float h=0.0, float l=0.0, float b=0.0):GeoObjekt(v, h), laenge(l), breite(b) {} . . .
Und die main sollte so aussehen:
. . . // GeoObjekt x; // wird nicht benötigt Rechteck a(); // wenn du keine Werte angibst wird, per Default, 0.0 verwendet . . . cout << "Die Fläche des Rechteckes ist: " << a.berechneFlaeche() << endl; // float Flaeche; kann man sich sparen. . . .
der Rest ist ganz i.o. außer dem fehlenden void.
imho würde ich die Destruktoren drinne lassen, auch wenn sie nichts tun. Ist bei deinem Code zwar nicht nötig, aber ich würde mir das gleich angewöhnen. Denn bei größeren Projekten ergibt sich irgentwann immer die Frage, ob sie vergessen wurden. Was dann zusätzliche Arbeit bedeuted.
:xmas1: MfG Bongolus.