&& Operator in C++ überladen???



  • benmar007 schrieb:

    ok die Lösung war das ich mit einer Typeinfo der Typ herrausbekommen habe welcher entstanden ist (zb H_vierpol).
    Dann wird der Vierpol auf den Typ gecastet (also der Zeiger auf den Vierpol).

    Explizite Typunterscheidung ist nahezu immer ein Designfehler.

    benmar007 schrieb:

    Gibts ne Möglichkeit das ganze irgendwie umzusetzen?

    Möglicherweise, aber könntest du vielleicht deine aktuelle Struktur etwas verdeutlichen? Also die Klassenhierarchie und die sinnvollen &&-Operatoren zwischen den Klassen. Mit Y und H kann ich recht wenig anfangen.



  • Ok, also:

    Basisklasse Vierpol.
    Von dieser Basisklasse erben 4 Kindklassen (Vierpol A,H,Z,Y).

    Diese Kindklasse sollen mittels && Operator reihe bzw. mittel || Operator parallel geschaltet werden können.

    D.h. ich benötige die Operationen H = H&&H H = H&&Y(geht)
    H = Y&&H und H = Y&&Y(geht nicht)
    Y = Y||Y Y = Y||H(geht)
    Y = H||Y und Y = H||H(geht nicht)
    Die ersten beiden Varianten funktionieren bereits, das Problem bei den letzen beiden Varianten ist das als linkes Element eine Y_Kindklassenobjekt steht aber als Ergebnis ein H_Klassenobjekt entstehen muss. Das ich diese Operatoren verwende ist nicht meine Idee, sondern die meines Prof., allerdings sollte die Wahl des Operators keine Rolle spielen, da das überladen im Prinzip gleich dem von anderen Operatoren sein sollte(binären).



  • Naja im schlimmsten Fall musst du eben je 4 mal den Operator überladen.

    H operator && (H const&, H const&);
    H operator && (H const&, Y const&);
    H operator && (Y const&, H const&);
    H operator && (Y const&, Y const&);
    
    // Selbiges für ||
    

    Du kannst aber natürlich andere überladene Versionen wiederverwenden, z.B.:

    H operator && (Y const& y, H const& h)
    {
        return h && y;
    }
    


  • benmar007 schrieb:

    Basisklasse Vierpol.
    Von dieser Basisklasse erben 4 Kindklassen (Vierpol A,H,Z,Y).

    Wozu soll das gut sein? Ich meine das mit der Vererbung?



  • krümelkacker schrieb:

    benmar007 schrieb:

    Basisklasse Vierpol.
    Von dieser Basisklasse erben 4 Kindklassen (Vierpol A,H,Z,Y).

    Wozu soll das gut sein? Ich meine das mit der Vererbung?

    Vielleicht, damit man im Operator mal ein wenig mit switch rumspielen kann, um die 16 Fälle zu dispatchen. Aber dann darf man nicht mehr Objektorientierte Programmierung für Dummies | ISBN: 3826629841 lesen, weil da steht, daß man sowas nicht tun soll.



  • Ok vielen Dank.

    Das ist dann also global als friend Funktion. Habe das nun mal so umgesetzt allerding gibt es bei der letzten Variante nun das Problem das selbst bei dieser Art den Operator zu überladen mindestens eines der Objekte ein Objekt der Kindklasse sein muss in der der Operator überladen wird. D.h. bei mir muss min. ein Objekt ein H_Vierpol Objekt sein, was bei H = Y&&Y nicht der Fall ist.

    Deshalb erhalt ich auch da einen Compilerfehler:

    1>c:\users\benmar007\desktop\komplexpraktikumneu\visual code\vierpol\vierpol\cvierpol_h.cpp(112) : error C2086: 'const CVierpol_Y &Y_Vierpol': Neudefinition
    1> c:\users\benmar007\desktop\komplexpraktikumneu\visual code\vierpol\vierpol\cvierpol_h.cpp(112): Siehe Deklaration von 'Y_Vierpol'
    1>c:\users\benmar007\desktop\komplexpraktikumneu\visual code\vierpol\vierpol\cvierpol_h.cpp(113) : error C2805: Binärer Operator '&&' hat zu wenig Parameter



  • Das mit dem Vererben ist meiner Meinung nach sinnvoll, da man einen allgemeinen Vierpol hat. Die Arten H,Z,Y,A unterscheiden sich von Ihren Attributen nicht, nur die Operatoren sind unterschiedlich, deswegen habe ich die 4 Kindklassen angelegt und die Operatoren in der Elternklasse virtual deklariert, so ist es möglich die Operatoren unterschiedlich zu überladen.(sollte zumindest so sein)

    Das das Ganze so ausufert hätte ich auch nicht gedacht aber nun muss es was werden da die Prüfung bald ist.



  • nebenbei, danke an alle für die rege Beteiligung an diesem Thread.:-)



  • benmar007 schrieb:

    // H = H+H	--> entspricht H&&H
    

    Hi,

    dir is schon bewusst das, dass eig 0 Sinn macht und nicht zur Verstaendlichkeit deiner Klasse beitraegt da das && eig eine logische Verknuepfung ist und entweder 0(false) oder 1(true) zurueck liefern sollte.

    Gruessle C0de4Fun



  • C0de4Fun schrieb:

    dir is schon bewusst das, dass eig 0 Sinn macht und nicht zur Verstaendlichkeit deiner Klasse beitraegt da das && eig eine logische Verknuepfung ist und entweder 0(false) oder 1(true) zurueck liefern sollte.

    Wenn && und || immer true oder false zurückgeben sollten, wäre eine Überladung dieser Operatoren in den meisten Fällen sinnlos. Was nicht heisst, dass es sich hier um eine semantisch gut gewählte Überladung handelt, aber ich wüsste andere Beispiele.

    Davon abgesehen hat benmar007 ja schon erwähnt, dass er die Aufgabe bekommen hat.



  • Nexus schrieb:

    C0de4Fun schrieb:

    dir is schon bewusst das, dass eig 0 Sinn macht und nicht zur Verstaendlichkeit deiner Klasse beitraegt da das && eig eine logische Verknuepfung ist und entweder 0(false) oder 1(true) zurueck liefern sollte.

    Wenn && und || immer true oder false zurückgeben sollten, wäre eine Überladung dieser Operatoren in den meisten Fällen sinnlos. Was nicht heisst, dass es sich hier um eine semantisch gut gewählte Überladung handelt, aber ich wüsste andere Beispiele.

    Joa is mir schon klar. Deswegen hab ich ja auch geschrieben "eig 0 Sinn" und "zurueck liefern sollte". Sorry wenn das ein bissle unverstaendlich rueber gekommen ist.

    Greetz C0de4Fun


Anmelden zum Antworten