2016-12-09 6 views
3

Bei folgenden Klassen:korrekt Umsetzung Vererbung

class Geometry { 
    public: 
    double distanceBetweenGeometries(const Geometry& g); 
    private:   
    Shape myShape; 
}; 

class Shape { 
    public: 
    double distance(const Shape& s1, const Shape& s2); 
}; 

class Rectangle : public Shape { 
    private: 
    double i,j,length,width; 
}; 

class Circle : public Shape { 
    private: 
    double i,j,radius; 
}; 

So jede Geometrie bekam eine Form des Typs Rectangle oder Circle. In meinem Programm muss ich den (euklidischen) Abstand zwischen zwei Geometrien berechnen. Somit gegeben zwei Geometrien g1 und g2 Ich nenne

g1.distanceBetweenGeometries(g2); 

und ich möchte den Abstand zwischen g1.myShape und g2.myShape zurückzukehren.

Ich weiß bereits, wie man den Abstand zwischen zwei Rechtecken, zwei Kreisen oder zwischen einem Rechteck und einem Kreis berechnet. Irgendwie habe ich keine objektorientierte Lösung zur Implementierung der Distanzfunktion erreicht.

Meine Idee ist: Rufen Sie die Abstand-Funktion von einer gegebenen Geometrie. Diese Abstandsfunktion ruft die Abstandsfunktion einer Form auf. In Shape::distance(..) muss ich irgendwie unterscheiden, welcher Typ s1 und s2 sind. Danach muss ich die richtige mathematische Formel wählen, um den Abstand zwischen ihnen zu berechnen. Kannst du mir sagen, ob meine Vererbungsidee hier ausreichend ist und wie man die Shape::distance(..) Funktion implementiert, damit sie automatisch bestimmen kann, welche Formel für die Entfernungsberechnung benötigt wird?

+0

C++ hat keine native * * mehrere Versand, haben Sie Ihre eigene zu implementieren. – Jarod42

+0

Wenn Sie eine 'Shape' speichern, verlieren Sie alle zusätzlichen Informationen von' Rectangle' oder 'Circle', so dass Sie nicht auf Informationen wie' length' oder 'width' zugreifen können nicht in der Lage sein, die gewünschte Entfernung zu berechnen. – Holt

+0

Könnten Sie mir sagen, was 'Geometry' anstelle von' Shape' speichern soll? – Kapa11

Antwort

2

Sie können so etwas wie tun:

class Circle; 
class Rectangle; 

// Your existing methods to do the real computation: 
double distanceRC(const Rectangle&, const Circle&); 
double distanceRR(const Rectangle&, const Rectangle&); 
double distanceCC(const Circle&, const Circle&); 

class Shape { 
public: 
    virtual ~Shape() = default; 
    virtual double distanceWith(const Shape&) const = 0; 
    virtual double distanceWith(const Rectangle&) const = 0; 
    virtual double distanceWith(const Circle&) const = 0; 
}; 

class Rectangle : public Shape { 
public: 
    double distanceWith(const Shape& s) const override { return s.distanceWith(*this); } 
    double distanceWith(const Rectangle& r) const override { return distanceRR(*this, r);} 
    double distanceWith(const Circle& c) const override { return distanceRC(*this, c); } 
private: 
    double i,j,length,width; 
}; 

class Circle : public Shape { 
public: 
    double distanceWith(const Shape& s) const override { return s.distanceWith(*this); } 
    double distanceWith(const Rectangle& r) const override { return distanceRC(r, *this);} 
    double distanceWith(const Circle& c) const override { return distanceCC(*this, c); } 
private: 
    double i,j,radius; 
}; 
+0

Ich habe keine Administratorrechte und kann nur mit '-std = C++ 0x' und nicht mit '-std = C++ 11' kompilieren (mit GCC 4.4.7 kann ich es nicht aktualisieren :(). Ihr Code funktioniert auch, wenn ich die 'override'-Anweisung verlasse, oder? Im Moment bekomme ich den Fehler' ..: error: expected ';' bevor 'override''. 'Override' hat keine große Auswirkung hier oder irre ich mich? – Kapa11

+0

Sie können 'override' entfernen, wenn Sie nicht in C++ 11 kompilieren können. – Jarod42

+0

Ok, danke für Ihre Bemühungen :) Es ist genau das, was ich tun musste. – Kapa11