Mehrfache Vererbung - mehrdeutige Variablen



  • Hi,

    bin im Moment dabei mit den Möglichkeiten der Objektorientierung etwas herumzuexperimentieren, und habe nun eine sinnvolle Verwendung mehrfacher Vererbung, aber noch keinen so guten Designansatz gefunden.

    Also in meinem Programm, dass einige geometrische Berechnungen durchführt, kommen u.a. Geraden und Ebenen im R3 vor - Gerade in Parameterform, Ebenen in Normalenform. An einer Stelle treten Ebene und eine darauf senkrechte Gerade als funktionale Einheit auf - d.h. Normalenvektor der Ebene ist der Richtungsvektor der Gerade, Startpunkte sind gleich.

    Also habe ich zwei Variablen in beiden Klassen "Line" und "Plane" auftauchen, und in meiner abgeleiteten Klasse, ich nenn sie mal "x" gleich sein sollen. Die beiden Klassen Line und Plane benötigen Zugriff auf diese Werte, damit ihre Methoden (Abstandsberechnungen, Projektionen) funktionieren. Das akzepztiert C++ aber nicht, weil so die Variablen mehrdeutig sind. (obwohl sie eigentlich immer die gleichen Werte haben sollen...)

    Hab mir jetzt folgendes überlegt: Plane bekommt nur Zeiger auf Norm.vektor und Startpunkt - und im Konstruktor von x werden diese auf die Werte von Line gesetzt - wenn ich aber jetzt nur eine Ebene will, brauch ich einen weiteren Konstruktor, der Speicher für die beiden Werte reserviert.

    Das geht zwar, aber ich finde das nicht so besonders elegant. Hat da jemand eine bessere Idee, wie man so ein Designproblem lößt?

    Vielen Dank,

    rabbit



  • RabbitsDad schrieb:

    An einer Stelle treten Ebene und eine darauf senkrechte Gerade als funktionale Einheit auf - d.h. Normalenvektor der Ebene ist der Richtungsvektor der Gerade, Startpunkte sind gleich.

    Hier würde ich keine Mehrfachvererbung verwenden, sondern eine Klasse erstellen, die beide Teilobjekte als Attribute enthält.



  • thx erstma - aber ich glaube insgesammt macht das das ganze nicht wesentlich eleganter. Jedesmal wenn von dem Objekt Startpunkt / Vektor geändert werden, müssen ja in beiden Unterobjekten geändert werden - also entweder ich arbeite mit Zugriffsfunktionen (GetVec/SetVec... o.ä.) oder mit Zeigern - wobei dann bei letzterem wieder Mehrfachvererbung gehen würde.

    Naja, so richtig denk´ ich glaub noch nicht objektorientiert 😉

    rabbit



  • Falls du wirklich mal Mehrfachvererbung in diesem Zusammenhang brauchst, suche doch mal nach dem Stichwort virtuelle Vererbung. Ist aber in deinem Fall nicht sonderlich sinnvoll.

    In deinem Fall sind Gerade und Ebene einfach Komponenten deiner zusammengesetzten Klasse.

    Vererbung würde aber heißen, das Objekt ist gleichzeitig eine Gerade und eine Ebene. Das ist aber unsinnig: Nehmen wir an, du hast eine Memberfunktion normaleBerechnen in deiner Ebenenklasse und in deiner Geradenklasse. Da du deine zusammengesetzte Klasse via Mehrfachvererbung aus Ebene und Gerade baust, bekommst du hier Probleme: Was ist denn jetzt eine Normale der zusammengesetzten Klasse? Eine Normale zur Ebene oder eine Normale zur Geraden? Wie du sieht sollte man sich genau überlegen, ob man auch wirklich Mehrfachvererbung braucht.

    Siehe auch: ➡ http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672.html



  • *lol* der Link ist wirklich gut 😉

    Aber ich glaub bei dem speziellen Problem ist das etwas anders - das erwünschte Verhalten ist ja, dass Richtungs-/Normalenvektor und Startpunkt immer identisch sind.
    Also entweder mach in x eine Zuweisungsfunktion

    x::SetSP(Vec& val) {
    m_Plane.SP = val;
    m_Line.SP = val;
    }
    

    Oder ich arbeite in Plane und Line mit Zeigern - gefällt mir beides nicht besonders.

    Danke für den Tipp mit virtueller Vererbung - hab jetzt probeweise mal eine Klasse GeoObject erstellt, die movVec und SP enthält, und Line und Plane sind von der virtuell abgeleitet - ich glaube, das ist bis jetzt die sauberste Lösung.

    Naja werd wohl noch einige Erfahrung in objektorientierter Programmierung sammeln müssen, bis da auf Anhieb besseres rauskommt...

    rabbit


Anmelden zum Antworten