Klassen: Instanz einer Klasse als Elementvariable einer anderen?
-
Hallo Leute,
Ich habe eine Frage, die mir absolut keine Ruhe lässt:
Ich sitze an einer Aufgabe, die sich um zwei Klassen dreht: 1. Punkt und 2. Rechteck, das aus vier Instanzen von Punkt besteht dreht:Ich habe eine Klasse Punkt mit Parametern, Konstruktor und verschiedenen get/set-Methoden (Quelldatei bzw. Headerdatei Punkt.cpp und Punkt.h)
Nun soll ich eine Klasse Rechteck machen (geschrieben in eine neue Quell/Headerdateien Rechteck.cpp / .h). Das konstruierte Rechteck soll aus 4 Punkten ( = also Instanzen der Klasse Punkt) bestehen.
Damit ich in Rechteck.cpp auf die Punkte und get/set-Methoden der Klasse Punkt zugreifen kann (für später, Fläche/Umfang vom Rechteck), binde ich die Headerdatei der Punktklasse ein (#include "Punkt.h")Jetzt wollte ich für die Klasse Rechteck die Elementvariablen definieren: es sollen vier Punkte aus Klasse Punkt sein. Mein Versuch:
Hier die Rechteck.h :
[...] #include "Punkt.h" class Rechteck { private: //Elementvariablen Punkt a, b, c, d; // ... getter/setter etc. }Und die dazugehörige Rechteck.cpp:
#include" Punkt.h" // Konstruktoren Rechteck::Rechteck(void) { Punkt a; Punkt b; Punkt c; Punkt d; } // [...]Ist die Definition der Parameter so in Ordnung, dass dadurch das Rechteck aus vier Instanzen der Klasse Punkt konstruiert würde?
Wie gesagt: Ich kann es leider bis Mittwoch nicht probieren (keine IDE), lässt mir aber keine Ruhe! Danke im Voraus!
PS: Falls sich jemand beschwert: Die Idee der "Auslagerung" in mehrere Quelldateien/Einbindung eigener Header stammt nicht von mir, das soll allerdings genau so geschehen!
Auch entschuldige ich mich vorab für die etwas wirre Ausdrucksweise und evtl. irrtümliche Bezeichnungen, ich bin mit den Begriffen der OOP noch nicht vollends vertraut.Gruß
Sven
-
Hier würden
abisdselbstständig konstruiert werden. Deshalb ist der Konstruktor sinnlos (ausser du benötigst spezielle Defaultwerte).EDIT: Die .cpp-Datei von Rechteck benötigt keine Inkludierungen, sofern du den Header und die Sourcedatei korrekt gelinkt hast und die Sourcedatei den Header inkudiert.
-
Wenn du die Point-Member im Rechteck initialisieren willst, kannst du eine Initialisierungsliste verwenden, etwa so:
Rechteck::Rechteck() : a(0,0), b(0,1), c(1,1) d(1,0) { }Allerdings solltest du in den Rechteck-Methoden darauf achten, daß da am Ende kein "krummes" Rechteck herauskommt

-
CStoll schrieb:
Allerdings solltest du in den Rechteck-Methoden darauf achten, daß da am Ende kein "krummes" Rechteck herauskommt

Oder man nutzt (wie normalerweise) nur zwei Punkte.
-
EOutOfResources schrieb:
Oder man nutzt (wie normalerweise) nur zwei Punkte.
Damit deckst du nur achsenparallele Rechtecke ab. Falls das aber reicht, würde ich das Rechteck auch mit zwei Punkten beschreiben.
-
Nexus schrieb:
EOutOfResources schrieb:
Oder man nutzt (wie normalerweise) nur zwei Punkte.
Damit deckst du nur achsenparallele Rechtecke ab. Falls das aber reicht, würde ich das Rechteck auch mit zwei Punkten beschreiben.
Falls das nicht ausreichen sollte, kannst du die Abstände a<->c == b<->d vergleichen.
-
Man kann auch nur die Daten speichern, mit denen das Rechteck eindeutig ist. Zum Beispiel zwei Punkte und ein Drehwinkel. Mit dem Vergleich erhöhst du nur den Aufwand für den Benutzer und hast zudem das Problem unexakter Floating-Point-Gleichheit.
(Oder intern zur Optimierung vier Punkte speichern, aber die Schnittstelle von der Redundanz befreien.)