Operatorüberladung "="



  • **Hi,

    ich habe eine Klasse in der zwei Strukturen definiert sind. Nun möchte ich den Zuweisungsoperator in der Art überladen:
    **

    typedef struct{
    double x,y,z;
    }DOU;
    
    typedef struct{
    float x,y,z;
    }FLO;
    
    Mayclass::DOU Mayclass::operator = (Mayclass::FLO B)
    {Mayclass::DOU A;
    A.x=B.x;A.y=B.y;A.z=B.z;
    return A;
    }
    

    geht sowas?
    das klappt beim mir nicht

    ...



  • Der Zuweisungsoperator wird überladen, um der Klasse etwas zuzuweisen, in der er definiert ist - d.h. in deinem Fall für Zuweisungen von FLO nach Mayclass. Wenn du zwischen den beiden structs zuweisen willst, mußt du ihnen selber einen Zuweisungsoperator verpassen:

    struct FLO;
    struct DOU
    {
      double x,y,z;
      DOU& operator=(const FLO&);
    }
    struct FLO
    {
      float x,y,z;
      FLO& operator=(const DOU);
    }
    
    Mayclass::DOU& Mayclass::DOU::operator=(const Mayclass::FLO& other)
    {
      x=other.x;y=other.y;z=other.z;
      return *this;
    }
    

    (und der Vollständigkeit halber solltest du auch Konvertierungs-konstruktoren bereitstellen)



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • CStoll schrieb:

    Code ...

    Das gefällt mir gar nicht.

    struct FLO;
    struct DOU {
      double x,y,z;
      DOU ();
      DOU (FLO const&);
    
    };
    struct FLO {
      float x,y,z;
      FLO ();
      explicit FLO (DOU const&);
    };
    
    DOU::DOU (FLO const& rhs) : x(rhs.x), y(rhs.y), z(rhs.z) {}
    
    FLO::FLO (DOU const& rhs) : x(rhs.x), y(rhs.y), z(rhs.z) {}
    

    Zuweisungsoperatoren braucht man dann gar nicht, denn der Compiler erstellt sie für die Objekte derselben Klasse eh, und im Zweifelsfall wird konvertiert.



  • Folgendes geht dann aber nicht mehr:

    FLO f;
    DOU d;
    
    f = d;
    

    Der Compiler würde vermutlich versuchen, den implizit generierten op= von FLO zu verwenden und vorher aus d ein FLO zu machen - was nicht geht wenn die Ctoren explicit sind. Also müsste man stattdessen folgendes schreiben:

    f = FLO(d);
    

    was widerum bedeutet, dass man erst den Umwandlungs-Ctor aufruft und danach den op=. Der op= für den jeweils anderen Typen würde den einen Funktionsaufruf einsparen - aber natürlich soll man erst anfangen zu optimieren wenn einem der profiler das gesagt hat 😉



  • pumuckl schrieb:

    Folgendes geht dann aber nicht mehr:

    FLO f;
    DOU d;
    
    f = d;
    

    Ja, das ist gewollt, da dabei Informationsverlust auftreten kann.


Anmelden zum Antworten