Zeiger oder Referenzen
-
Hallo,
ich hab eine Klasse (oder eine Anzahl von Klassen), die Bildschirmkoordinaten verwalten sollen. Mit Hilfe dieser Klassen soll man auch kompliziertere Koordinaten (z.B. 1/2 mal der Bildschirmbreite + 20 Pixel, aber nicht mehr als 2/3*die Bildschirmbreite).
Dies habe ich wie folgt modelliert:ein Template, welches eine Koordinate darstellt (der Templateparameter ist die Funktion, die die Bildschirmdimension zurückgibt (Höhe oder Breite, je nachdem ob x- oder y- koordinate)):
class CoorImpNode; template<int (*GetScale)()> class Coor { private: CoorImpNode* ImpNode; protected: public: int GetAbs() const; double GetValue() const; Coor& operator= (const Coor& coor); Coor(const Coor& coor) { this->ImpNode = coor.ImpNode->GetClone(); } Coor(CoorImpNode* impNode) { this->ImpNode = impNode->GetClone(); } virtual ~Coor() { delete ImpNode; } };Und dann eine Basisklasse und verschiedene abgeleitete Klassen für die konkrete Implementierung der Koordinaten:
//Basisklasse class CoorImpNode { private: protected: public: virtual double GetValue(double scale) const = 0; virtual CoorImpNode* GetClone() const = 0; CoorImpNode(); virtual ~CoorImpNode(); }; //normale Kordinate, als Bruchteil des Bildschirms class CINStandard : public CoorImpNode { private: double Value; public: double GetValue(double scale) const; CoorImpNode* GetClone() const; CINStandard(double value); virtual ~CINStandard(); }; //abolute Koordinate in Pixeln class CINAbsolute : public CoorImpNode { private: double Value; public: double GetValue(double scale) const; CoorImpNode* GetClone() const; CINAbsolute(double value); CINAbsolute(const CINAbsolute& obj); virtual ~CINAbsolute(); }; //Summe zweier Koordinaten class CINSum : public CoorImpNode { private: CoorImpNode* Left; CoorImpNode* Right; public: double GetValue(double Scale) const; CoorImpNode* GetClone() const; CINSum(CoorImpNode* left, CoorImpNode* right); CINSum(const CINSum& obj); virtual ~CINSum(); }; //etc.Nun kann man beliebige Baumartige Strukturen aus diesen Koordinaten (diese representieren dann einen Term zur Berechnung der Kordinate) zusammenstellen.
Meine Frage ist, was sollte den Konstruktoren übergeben werden?Ich möchte gerne, dass man in etwa sowas schreiben kann:
(XCoor ist ein typedef für Coor mit dem richtigen template-Parameter)
XCoor a(CINSum(CINStandard(1.0/2.0),CINAbsolute(20)));Kann ich dafür den Konstruktoren konstante Referenzen auf CoorImpNode übergeben?
Oder wie oben Zeiger? Was wäre effizienter?Vielen Dank für die Mühe, alle Kommentare sind willkommen!
Niko