Aufgabe zu Klasse mit GraphObj- punkt, rechteck, kreis
-
ok habs komplett geändert:
/* * Graphobjekte.cpp * * Created on: 30.01.2010 * Author: c.groupe */ #include <iostream> #include <algorithm> #include <math.h> using namespace std; class Point { public: Point() {itsX = itsY = 0;} void SetX(int x) { itsX = x; } void SetY(int y) { itsY = y; } int GetX()const { return itsX;} int GetY()const { return itsY;} private: int itsX; int itsY; }; class GraphObj { public: virtual void flaeche(); // x,y anzeigen virtual void distanz(); // abstand zweier obj vom referenzpunkt virtual ~GraphObj(){} protected: int itsX, itsY; // Bezugspunkt GraphObj( int itsX, int itsY); // allg. Konstruktor GraphObj( const GraphObj& rhs); // Kopiekonstruktor // virtual ~GraphObj(){} // Destruktor <-- warum kann ich ihn nicht hier lassen? }; class Rechteck : public GraphObj { int hoehe, breite; public: virtual void flaeche(); virtual void distanz(); Rechteck(int X, int Y, int hoch, int breit); ~Rechteck() {} private: Point p1; Point p2; }; class Kreis : public GraphObj { public: virtual void flaeche(); virtual void distanz(); Kreis(){} ~Kreis(){} float GetRadius() const { return itsRadius; } void SetRadius(int Radius) {itsRadius = Radius;} Point GetMittelpunkt() const { return itsMittelpunkt; } void SetMittelpunkt(Point Location) {itsMittelpunkt = Location;} private: Point itsMittelpunkt; float itsRadius; }; GraphObj::GraphObj(int aX, int aY) : itsX(aX), itsY(aY) {} GraphObj::GraphObj(const GraphObj& rhs) { itsX=rhs.itsX; itsY=rhs.itsY; } Rechteck::Rechteck(int aX, int aY, int h, int b) : GraphObj(aX,aY), hoehe(h), breite(b) {} // Flächenberechnung void Rechteck::flaeche() { int Width = itsY - itsX; int Height = hoehe - breite; cout << "Fläche des Rechtecks wird berechent: " << Width * Height << endl; } void Kreis::flaeche() { cout << "Fläche des Kreises wird berechnet: " << ((itsRadius)*(itsRadius))*3.1415 << endl; } // Distanzberechnung void Rechteck::distanz() { int Width = itsY - itsX; int Height = hoehe - breite; cout << " Distanz berechen im Rechteck: " << (sqrt((Width*Width) + (Height*Height))) << endl; } void Kreis::distanz() { cout << " Distanz berechnen im Kreis: " << itsRadius << endl; } int main() { GraphObj* graphobj[2]; // graphobj[0] = new Point; graphobj[0] = new Rechteck; graphobj[1] = new Kreis; for (int i=0; i<3; i++) { graphobj[i]->flaeche(); graphobj[i]->distanz(); delete graphobj[i]; } return 0; }
hab zwar immernoch ein paar probleme,
vorallem wie ich die main mit einem zeigen auf " 3 " objeke machen soll..
-
oh man, ich bin ziemlich ausgebrannt..
-
Point() {itsX = itsY = 0;}
Verwende dafür die Konstruktor-Initialisierungsliste:
Point() : itsX(0), itsY(0) { }
Ausserdem wäre es sicher nicht schlecht, eine Konstruktorüberladung anzubieten, welche den beiden Koordinaten gleich übergebene Werte zuweist.
virtual void flaeche(); virtual void distanz();
Mach diese Funktionen rein virtuell, da sie für
GraphObj
keine Implementierung haben.int Width = itsY - itsX; int Height = hoehe - breite
Denk da nochmals in Ruhe drüber nach.
Point itsMittelpunkt;
Was für Informationen enthält dieser Member, welche nicht bereits durch
itsX
unditsY
ausgedrückt werden könnten? Und weshalb inkonsistent sein und einmal eine Punkt-Klasse, ein anderes Mal zwei einzelne Koordinaten speichern?for (int i=0; i<3; i++)
Wie gross war dein Array nochmal?
c.groupe schrieb:
oh man, ich bin ziemlich ausgebrannt..
Dann beginne nächstes Mal klein und strukturier zuerst die Basisklasse sauber. Programmiere nicht gleich drauf los, sondern überlege dir, was für Funktionen sie anbieten soll und was für Klassen davon abgeleitet werden könnten. Dann machst du weiter mit dem Rechteck, und so weiter...
-
ok danke, ich werds nacher oder morgen nochmal in angriff nehmen
-
Nexus schrieb:
Point() {itsX = itsY = 0;}
Verwende dafür die Konstruktor-Initialisierungsliste:
Point() : itsX(0), itsY(0) { }
Ausserdem wäre es sicher nicht schlecht, eine Konstruktorüberladung anzubieten, welche den beiden Koordinaten gleich übergebene Werte zuweist.
Wie in der Aufgabenstellung steht sollten die Eigenschaften und Methoden nicht geändert werden.
Nexus schrieb:
for (int i=0; i<3; i++)
Wie gross war dein Array nochmal?
Steht nun nicht explitzit in der Aufgabe aber er hat dazu gesagt man soll ne main mit einem zeiger auf 3 Objekten machen, weiss nicht nicht welche drei er meint.
Nexus schrieb:
c.groupe schrieb:
oh man, ich bin ziemlich ausgebrannt..
Dann beginne nächstes Mal klein und strukturier zuerst die Basisklasse sauber. Programmiere nicht gleich drauf los, sondern überlege dir, was für Funktionen sie anbieten soll und was für Klassen davon abgeleitet werden könnten. Dann machst du weiter mit dem Rechteck, und so weiter...
Wenn ich alles posen würde hier, wäres doch viel zu viel.
Ich wollte damit nur zum ausdruckbringen, dass ich nach 6h programmieren, einfach nicht mehr kann.
-
So nun mal zurück zur Aufgabe:
Hier nun eine Aufgabe zu Graphobj:
Seite 1: http://img692.imageshack.us/img692/395/aufgabegraphobj1.jpg
Seite 2: http://img693.imageshack.us/img693/1657/aufgabegraphobj2.jpgzu a: Stellen sie die Klassenhierachie zwischen diesen Klassen dar.
Ich denke er meint damit das:
class Point : public GraphObj
GraphObj die Basisklasse darstellung und Point von GraphObj erbt.
Zumal er ja auch in der Main(): einen Zeigen auf 3 Objekte haben will.zu b: Es fällt auf, dass die Klasse Point ihre beiden Komponenten vor unbefugtem Zugriff aus einer andern Klasse schützt. Erweitern Sie Point dahingehend, dass beiden Komponenten seperat gelesen(agbefragt) und gesetzt werden kann.
class Point : public GraphObj { public: Point() {itsX = itsY = 0;} void SetX(int x) { itsX = x; } void SetY(int y) { itsY = y; } int GetX()const { return itsX;} int GetY()const { return itsY;} private: int itsX; int itsY; };
Denke das geht soweit damit auch in Ordnung.
zu c: Jedes Objekt von der Klasse GraphObj bzw. von Rechteck und Kreis soll einen Referenzpunkt besitzen (beim Kreis ist es der Mittelpunkt, beim Rechteck dessen Schwerpunkt). Geben sie alle notwendigen Erweiterungen an ( bei dieser Aufgabe soll Vererbung ausgenutzt werden!).
..da bin ich nun dran
-
soweit bin ich nun:
/* * Graphobjekte.cpp * * Created on: 31.01.2010 * Author: c.groupe */ #include <iostream> #include <math.h> using namespace std; class GraphObj { public: virtual void flaeche(); // fläche vom obj virtual void distanz(); // abstand zweier obj vom referenzpunkt virtual ~GraphObj(){} protected: int itsX, itsY; // Bezugspunkt GraphObj() {} GraphObj( int itsX, int itsY); // allg. Konstruktor GraphObj( const GraphObj& rhs); // Kopiekonstruktor // virtual ~GraphObj(){} // Destruktor }; class Point : public GraphObj { public: Point() {itsX = itsY = 0;} void setX(double x) { itsX = x; } void setY(double y) { itsY = y; } double getX()const { return itsX;} double getY()const { return itsY;} private: double itsX; double itsY; }; class Rechteck : public GraphObj { public: virtual void flaeche(); virtual void distanz(); Rechteck() {} ~Rechteck() {} private: Point p1; Point p2; }; class Kreis : public GraphObj { public: virtual void flaeche(); virtual void distanz(); Kreis(){} ~Kreis(){} float getRadius() const { return itsRadius; } void setRadius(float Radius) {itsRadius = Radius;} Point getMittelpunkt() const { return itsMittelpunkt; } void setMittelpunkt(Point Location) {itsMittelpunkt = Location;} private: Point itsMittelpunkt; float itsRadius; }; // Flächenberechnung void Rechteck::flaeche() { double x1,x2,y1,y2; double laenge, breite; p1.setX(x1); p2.setX(x2); p1.setY(y1); p2.setY(y2); laenge = x2-x1; breite = y2-y1; cout << "Flächenberechnung Rechteck: " << laenge*breite << endl; } void Kreis::flaeche() { double r; setRadius(r); cout << "Flächenberechnung Kreis: " << ((r*r)*3.1415) << endl; } // Distanzberechnung void Rechteck::distanz() { double x1,x2,y1,y2; double mX, mY; p1.setX(x1); p2.setX(x2); p1.setY(y1); p2.setY(y2); mX= ((x1+x2)/2); mY= ((y1+y2)/2); cout << " Schwerpunkt Rechteck: " << mX << " " << mY << endl; } void Kreis::distanz() { } int main() { GraphObj* graphobj[3]; graphobj[0] = new Point; graphobj[1] = new Rechteck; graphobj[2] = new Kreis; for (int i=0; i<3; i++) { graphobj[i]->flaeche(); graphobj[i]->distanz(); delete graphobj[i]; } return 0; }
hab allerdings keine ahnung wie ich das mitn mittelpunkt vom kreis machen soll
und dann was er für die distanzberechnung vorsieht.glaube sqrt(x2+y2), aber auf was bezogen ? wenn ich doch zwei obj brauch..
-
Ein paar Sachen:
* Du hast so ne schöne Point-Klasse. Warum nimmst du die nicht her für deinen Bezugspunkt in GraphObj?
* Du verwendest immer noch keine Initialisierungsliste! Das ist ein wunderschönes C++-Feature, welches auch verwendet werden sollte.
* Point speichert X und Y als int, setter und getter sind aber double...
flaeche und distanz würde ich unbedingt einen return-value verpassen. Ohne dem ist die Funktion nutzlos!* Rechteck::distanz ist noch ziemliche Katastrophe... x1, x2, y1, y2 sind uninitialisiert und du setzt mit denen p1 und p2 neu! Außerdem ist distanz != schwerpunkt. Und wieder: Hier gehört ein return hin, ohne dem ist die Funktion nutzlos!
So viel erstmal beim ersten Überfliegen..
-
c.groupe schrieb:
Nexus schrieb:
Point() {itsX = itsY = 0;}
Verwende dafür die Konstruktor-Initialisierungsliste:
Point() : itsX(0), itsY(0) { }
Ausserdem wäre es sicher nicht schlecht, eine Konstruktorüberladung anzubieten, welche den beiden Koordinaten gleich übergebene Werte zuweist.
Wie in der Aufgabenstellung steht sollten die Eigenschaften und Methoden nicht geändert werden.
Du sollst sie ja eben ergänzen! Konstruktorüberladung ist so eine sinnvolle Ergänzung.
Es ist dir lediglich untersagt, die bestehenden Eigenschaften und Methoden zu verändern. Was du übrigens tust, indem du Point von GraphObj ableitest...// edit:
Ok, der Code verwendet keine Initialisierungsliste, wahrscheinlich weil sie zu dem Zeipunkt noch nicht bekannt ist.
-
so habs mal in double werte abgeändert:
/* * Graphobjekte.cpp * * Created on: 31.01.2010 * Author: c.groupe */ #include <iostream> #include <math.h> using namespace std; class GraphObj { public: virtual double flaeche(); // fläche zweier punkte virtual double distanz(); // abstand zweier obj vom referenzpunkt virtual ~GraphObj(){} protected: int itsX, itsY; // Bezugspunkt GraphObj() {} // GraphObj( int itsX, int itsY); // allg. Konstruktor // GraphObj( const GraphObj& rhs); // Kopiekonstruktor // virtual ~GraphObj(){} // Destruktor }; class Point : public GraphObj { public: Point() {itsX = itsY = 0;} void setX(double x) { itsX = x; } void setY(double y) { itsY = y; } double getX()const { return itsX;} double getY()const { return itsY;} private: double itsX; double itsY; }; class Rechteck : public GraphObj { public: virtual double flaeche(); virtual double distanz(); Rechteck() {} ~Rechteck() {} private: Point p1; Point p2; }; class Kreis : public GraphObj { public: virtual double flaeche(); virtual double distanz(); Kreis(){} ~Kreis(){} float getRadius() const { return itsRadius; } void setRadius(float Radius) {itsRadius = Radius;} Point getMittelpunkt() const { return itsMittelpunkt; } void setMittelpunkt(Point Location) {itsMittelpunkt = Location;} private: Point itsMittelpunkt; float itsRadius; }; // Flächenberechnung double Rechteck::flaeche() { double x1,x2,y1,y2; double laenge, breite; p1.setX(x1); p2.setX(x2); p1.setY(y1); p2.setY(y2); laenge = x2-x1; breite = y2-y1; cout << "Flächenberechnung Rechteck: "; return laenge*breite; } double Kreis::flaeche() { double r; setRadius(r); cout << "Flächenberechnung Kreis: "; return ((r*r)*3.1415); } // Distanzberechnung double Rechteck::distanz() { double x1=0,x2=0,y1=0,y2=0; double mX=0, mY=0; p1.setX(x1); p2.setX(x2); p1.setY(y1); p2.setY(y2); mX= ((x1+x2)/2); mY= ((y1+y2)/2); cout << " Schwerpunkt Rechteck: " << mX << " " << mY << endl; cout << " Distanz Rechteck: "; return sqrt((mX*mX)+(mY*mY)); } double Kreis::distanz() { return 0; } int main() { GraphObj* graphobj[3]; graphobj[0] = new Point; graphobj[1] = new Rechteck; graphobj[2] = new Kreis; for (int i=0; i<3; i++) { graphobj[i]->flaeche(); graphobj[i]->distanz(); delete graphobj[i]; } return 0; }
mit ist klar das der schwerpunkt keine distanz ist, aber ich brauch ich eben auch.. mhmmm
-
Du hast dir den Rest meiner Punkte nicht durchgelesen
Ansonsten steht doch da was du machen sollst: Klassen erweitern
Füge eine Methode
virtual Point bezugspunkt() const =0;
in GraphObj ein. Kreis und Rechteck geben dann entsprechendes zurück.
Weiterhin ein
double distanz( const GraphObj& other ) const;
in GraphObj.
Das kannst du ja direkt in GraphObj implementieren, da sich die Berechnung bei Kreis und Rechteck nicht unterscheiden.Allerdings muss ich sagen Würd ich distanz in Point implementieren und in GraphObj::distanz einfach
this->bezugspunkt().distanz(other.besugspunkt());
hernehmen.
-
doch hab ich mir durchgelesen, aber ich versteh nicht,
wo mein problem ist, es kann doch garnicht so schwer sein,
die aufgabe ist für 30min angesetzt und ich bin schon nun
zwei tage dran./* * Graphobjekte.cpp * * Created on: 31.01.2010 * Author: c.groupe */ #include <iostream> #include <math.h> using namespace std; class GraphObj { public: virtual double flaeche(); // fläche zweier punkte virtual double distanz(); // abstand zweier obj vom referenzpunkt virtual Point bezugspunkt() const =0; double distanz( const GraphObj& other ) const; virtual ~GraphObj(){} protected: int itsX, itsY; // Bezugspunkt GraphObj() {} // double distanz( const GraphObj& other ) const; // GraphObj( int itsX, int itsY); // allg. Konstruktor // GraphObj( const GraphObj& rhs); // Kopiekonstruktor // virtual ~GraphObj(){} // Destruktor }; class Point : public GraphObj { public: Point() {itsX = itsY = 0;} void setX(double x) { itsX = x; } void setY(double y) { itsY = y; } double getX()const { return itsX;} double getY()const { return itsY;} private: double itsX; double itsY; }; class Rechteck : public GraphObj { public: virtual double flaeche(); virtual double distanz(); Rechteck() {} ~Rechteck() {} private: Point p1; Point p2; }; class Kreis : public GraphObj { public: virtual double flaeche(); virtual double distanz(); Kreis(){} ~Kreis(){} float getRadius() const { return itsRadius; } void setRadius(float Radius) {itsRadius = Radius;} Point getMittelpunkt() const { return itsMittelpunkt; } void setMittelpunkt(Point Location) {itsMittelpunkt = Location;} private: Point itsMittelpunkt; float itsRadius; }; // Flächenberechnung double GraphObj::flaeche() { return 0; } double Rechteck::flaeche() { double x1,x2,y1,y2; double laenge, breite; p1.setX(x1); p2.setX(x2); p1.setY(y1); p2.setY(y2); laenge = x2-x1; breite = y2-y1; cout << "Flächenberechnung Rechteck: "; return laenge*breite; } double Kreis::flaeche() { float r=0; setRadius(r); cout << "Flächenberechnung Kreis: "; return ((r*r)*3.1415); } // Distanzberechnung double GraphObj::distanz() { return this->bezugspunkt().distanz(other.besugspunkt()); } double Rechteck::distanz() { double x1=0,x2=0,y1=0,y2=0; double mX=0, mY=0; p1.setX(x1); p2.setX(x2); p1.setY(y1); p2.setY(y2); mX= ((x1+x2)/2); mY= ((y1+y2)/2); cout << " Schwerpunkt Rechteck: " << mX << " " << mY << endl; cout << " Distanz Rechteck: "; return sqrt((mX*mX)+(mY*mY)); } double Kreis::distanz() { return 0; } int main() { GraphObj* graphobj[3]; graphobj[0] = new Point; graphobj[1] = new Rechteck; graphobj[2] = new Kreis; for (int i=0; i<3; i++) { graphobj[i]->flaeche(); graphobj[i]->distanz(); delete graphobj[i]; } return 0; }
Sitze einfach aufn Schlauch, denke ich muss mir mal ne andere aufgabe suchen,
damit ich auch mal wieder ein erfolgserlebniss erlebe. ..
-
Was bringt eine Funktion distanz, wenn du kein Objekt angeben kannst, zu welchem die Distanz berechnet werden soll?
Die parameterlose distanz() macht also keinen Sinn.Du brauchst jetzt nur überlegen, wie du am besten deinen Besugspunkt ausrechnest. Für Kreis ist das obersimpel: Du hast ihn bereits als Member - der Mittelpunkt. ->trivial.
Für Rechteck ist es der Schwerpunkt == Mittelpunkt. Am einfachtsen geht das wenn du der Klasse Punkt entsprechende Funktionen verpasst wie operator +, operator/ usw, die das Rechnen vereinfachen.Ich geb dir hier mal ein wenig Code:
class Point { int x, y; public: Point() { x = y = 0; } Point(int x_, int y_) : x(x_), y(y_) {} int getX() const { return x; } int getY() const { return y; } }; Point operator +( const Point& left, const Point& right ) { return Point( left.getX() + right.getX(), left.getY() + right.getY() ); } Point operator /( const Point& point, int div ) { return Point( point.getX() / div, Point.getY() / div ); // hier wird klar: // Es gibt Rundungsfehler, wenn die Division nicht aufgeht! // Darum wird in Fällen wo Rechteck ungerade Seitenlängen hat ein falscher Mittelpunkt berechnet! } double distanz( const Point& left, const Point& ricght ) { // hier Distanz berechnen } class GraphObj { // GraphObj braucht gar keine Member! // Alles wird über virtuelle Funktionen geregelt. public: virtual Point referenzpunkt() const =0; }; // Distanz als freie Funktion ist besser, // da alles über das public-Interface von GraphObj erledigt werden kann double distanz( const GraphObj& left, const GraphObj& right ) { return distanz( left.referenzpunkt(), right.referenzpunkt() ); } class Rechteck : public GraphObj { Point upperLeft, bottomRight; // umbenannt, p1 p1 sind ja sowas von nichtssagend... public: Rechteck( Point ul, Point br ) : upperLeft(ul), bottomRight(br) {} Point referenzpunkt() const { return (upperLeft + bottomRight) / 2; } };
Das was fehlt implemenntierst du in aller Ruhe. Es ist gut, dass du viel übst, aber du solltest dich 1) nicht überfordern und 2) Ruhe bewahren!
-
Ok, muss einfach dran bleiben.
/* * Graphobjekte.cpp * * Created on: 31.01.2010 * Author: c.groupe */ #include <iostream> #include <math.h> using namespace std; class Point { public: Point() {itsX = itsY = 0;} Point(double x, double y) : itsX(x), itsY(y) {} double getX()const { return itsX;} double getY()const { return itsY;} // void setX(double x) { itsX = x; } // void setY(double y) { itsY = y; } private: double itsX; double itsY; }; Point operator+ (const Point& left, const Point& right) { return Point( left.getX()+right.getX(), left.getY()+right.getY() ); } Point operator/ (const Point& point, int div) { return Point ( point.getX() / div , point.getY() / div); } double distanz( const Point& left, const Point& right) { return 0; // Distanz: sqrt(x*x +y*y) } class GraphObj { public: virtual Point referenzpunkt() const =0; }; double distanz( const GraphObj& left, const GraphObj& right) { return distanz( left.referenzpunkt(), right.referenzpunkt() ); } class Rechteck : public GraphObj { public: Rechteck( Point ul, Point br) : itsUpperLeft(ul), itsBottomRight(br) {} Point referenzpunkt() const { return (itsUpperLeft + itsBottomRight) / 2; } private: // umbenannt von p1 p2 Point itsUpperLeft; Point itsBottomRight; }; class Kreis : public GraphObj { public: Kreis(float r) { itsRadius = r; } Point mittelpunkt() const { return itsMittelpunkt; } private: Point itsMittelpunkt; float itsRadius; }; int main() { }
habs mal umgeändert und noch Kreis hinzugefügt, richtig so ?
-
hab mal die distanz hinzugefügt
/* * Graphobjekte.cpp * * Created on: 31.01.2010 * Author: c.groupe */ #include <iostream> #include <math.h> using namespace std; class Point { public: Point() {itsX = itsY = 0;} Point(double x, double y) : itsX(x), itsY(y) {} double getX()const { return itsX;} double getY()const { return itsY;} void setX(double x) { itsX = x; } void setY(double y) { itsY = y; } private: double itsX; double itsY; }; Point operator+ (const Point& left, const Point& right){ return Point( left.getX()+right.getX(), left.getY()+right.getY() ); } Point operator/ (const Point& point, int div){ return Point ( point.getX() / div , point.getY() / div); // hier wird klar: Es gibt Rundungsfehler, wenn die // Division nicht aufgeht! Darum wird in Fällen wo Rechteck // ungerade Seitenlängen hat ein falscher Mittelpunkt berechnet! } double distanz( const Point& left, const Point& right){ return sqrt( ( left.getX()*right.getX() )+( left.getY()*right.getY() ) ); } class GraphObj { public: GraphObj(){} // virtual double flaeche(); virtual Point referenzpunkt() const =0; }; double distanz( const GraphObj& left, const GraphObj& right){ return distanz( left.referenzpunkt(), right.referenzpunkt() ); } class Rechteck : public GraphObj { public: Rechteck(){} Rechteck( Point ul, Point br) : itsUpperLeft(ul), itsBottomRight(br) {} Point referenzpunkt() const { return (itsUpperLeft + itsBottomRight) / 2; } private: // Point p1, p2; umbenannt in: Point itsUpperLeft; Point itsBottomRight; }; class Kreis : public GraphObj { public: Kreis(){} Kreis(float r) { itsRadius = r; } Point mittelpunkt() const { return itsMittelpunkt; } private: Point itsMittelpunkt; float itsRadius; }; int main() { }
-
Hast du noch irgendeine konkrete Frage?
-
drakon schrieb:
Hast du noch irgendeine konkrete Frage?
denke mal die distanz ist doch soweit in ordnung.
wie soll ich nun am besten mit den faechen vorrangehen,
auch in der klasse oder besser ausserhalb deklarieren, ich mein
ist ja bei rechteck und kreis nicht gleich.
-
Ich weiss jetzt zwar nicht genau, was du meinst, aber mach doch eine abstrakte Funktion für die Fläche und implementier die dann spezifisch für den Kreis und das Rechteck.
-
also so ?
So Fläche des Rechtecks klappt noch nicht, zuweit gedacht ?/* * Graphobjekte.cpp * * Created on: 04.02.2010 * Author: c.groupe */ #include <iostream> #include <math.h> using namespace std; class Point { public: Point() {itsX = itsY = 0;} Point(double x, double y) : itsX(x), itsY(y) {} double getX()const { return itsX;} double getY()const { return itsY;} void setX(double x) { itsX = x; } void setY(double y) { itsY = y; } private: double itsX; double itsY; }; Point operator+ (const Point& left, const Point& right){ return Point( left.getX()+right.getX(), left.getY()+right.getY() ); } Point operator- (const Point& left, const Point& right){ return Point( left.getX()-right.getX(), left.getY()-right.getY() ); } Point operator* (const Point& point, int other){ return Point ( point.getX() * other , point.getY() * other); } Point operator/ (const Point& point, int div){ return Point ( point.getX() / div , point.getY() / div); // hier wird klar: Es gibt Rundungsfehler, wenn die // Division nicht aufgeht! Darum wird in Fällen wo Rechteck // ungerade Seitenlängen hat ein falscher Mittelpunkt berechnet! } double distanz( const Point& left, const Point& right){ return sqrt( ( left.getX()*right.getX() )+( left.getY()*right.getY() ) ); } class GraphObj { public: GraphObj(){} virtual double flaeche()=0; virtual Point referenzpunkt() const =0; }; double distanz( const GraphObj& left, const GraphObj& right){ return distanz( left.referenzpunkt(), right.referenzpunkt() ); } class Rechteck : public GraphObj { public: Rechteck(){} Rechteck( Point ul, Point br, Point bl) : itsUpperLeft(ul), itsBottomRight(br), itsBottomLeft(bl) {} Point referenzpunkt() const { return (itsUpperLeft + itsBottomRight) / 2; } virtual double flaeche()=0; void setUpperLeft ( Point upperleft ) { itsUpperLeft = upperleft; } Point getUpperLeft() const { return itsUpperLeft; } void setBottomRight ( Point bottomright ) { itsBottomRight = bottomright; } Point getBottomRight() const { return itsBottomRight; } void setBottomLeft ( Point bottomleft ) { itsBottomLeft = bottomleft; } Point getBottomLeft() const { return itsBottomLeft; } private: // Point p1, p2; umbenannt in: Point itsUpperLeft; Point itsBottomRight; Point itsBottomLeft; }; class Kreis : public GraphObj { public: Kreis(){} Kreis(float r) { itsRadius = r; } Point mittelpunkt() const { return itsMittelpunkt; } virtual double flaeche()=0; void setRadius ( int radius ) { itsRadius = radius; } double getRadius() const { return itsRadius; } private: Point itsMittelpunkt; float itsRadius; }; double Rechteck::flaeche() { Point hoehe, breite; hoehe = getBottomLeft()-getUpperLeft(); breite = getBottomLeft()-getBottomRight(); return hoehe*breite; } double Kreis::flaeche() { return getRadius()*getRadius()*3.1415; } int main() { }
-
manno ,entwerder ich bekomme die fläche von rechteck hin, oder die fläche von kreis, beides klappt irgendwie nicht, weil ich einfach point nicht in double beziehen kann oder umgekehrt, ausserdem ist der radius in float.. ach man
/* * Graphobjekte.cpp * * Created on: 04.02.2010 * Author: c.groupe */ #include <iostream> #include <math.h> using namespace std; class Point { public: Point() {itsX = itsY = 0;} Point(double x, double y) : itsX(x), itsY(y) {} double getX()const { return itsX;} double getY()const { return itsY;} void setX(double x) { itsX = x; } void setY(double y) { itsY = y; } private: double itsX; double itsY; }; Point operator+ (const Point& left, const Point& right){ return Point( left.getX()+right.getX(), left.getY()+right.getY() ); } Point operator- (const Point& left, const Point& right){ return Point( left.getX()-right.getX(), left.getY()-right.getY() ); } Point operator* (const Point& hoehe, const Point& breite){ return Point ( hoehe.getX()*breite.getX() , hoehe.getY()*breite.getY() ); } Point operator/ (const Point& point, int div){ return Point ( point.getX() / div , point.getY() / div); // hier wird klar: Es gibt Rundungsfehler, wenn die // Division nicht aufgeht! Darum wird in Fällen wo Rechteck // ungerade Seitenlängen hat ein falscher Mittelpunkt berechnet! } double distanz( const Point& left, const Point& right){ return sqrt( ( left.getX()*right.getX() )+( left.getY()*right.getY() ) ); } class GraphObj { public: GraphObj(){} virtual Point flaeche()=0; virtual Point referenzpunkt() const =0; }; double distanz( const GraphObj& left, const GraphObj& right){ return distanz( left.referenzpunkt(), right.referenzpunkt() ); } class Rechteck : public GraphObj { public: Rechteck(){} Rechteck( Point ul, Point br, Point bl) : itsUpperLeft(ul), itsBottomRight(br), itsBottomLeft(bl) {} Point referenzpunkt() const { return (itsUpperLeft + itsBottomRight) / 2; } virtual Point flaeche()=0; void setUpperLeft ( Point upperleft ) { itsUpperLeft = upperleft; } void setBottomRight ( Point bottomright ) { itsBottomRight = bottomright; } void setBottomLeft ( Point bottomleft ) { itsBottomLeft = bottomleft; } Point getUpperLeft() const { return itsUpperLeft; } Point getBottomRight() const { return itsBottomRight; } Point getBottomLeft() const { return itsBottomLeft; } private: // Point p1, p2; umbenannt in: Point itsUpperLeft; Point itsBottomRight; Point itsBottomLeft; }; class Kreis : public GraphObj { public: Kreis(){} Kreis(float r) { itsRadius = r; } Point mittelpunkt() const { return itsMittelpunkt; } virtual Point flaeche()=0; void setRadius ( float radius ) { itsRadius = radius; } float getRadius() const { return itsRadius; } private: Point itsMittelpunkt; float itsRadius; }; Point Rechteck::flaeche() { Point hoehe, breite; hoehe = getBottomLeft()-getUpperLeft(); breite = getBottomLeft()-getBottomRight(); return hoehe*breite; } Point Kreis::flaeche() { return getRadius()*getRadius()*3.1415; } int main() { }