Unärer "-" Operator



  • Hallo Leute,

    ich habe mal wieder eine Frage. Ich habe in meiner Klasse
    für Vektoren den "-" Operator überladen.

    Nun möchte ich aber auch den unären "-" Operator überladen.
    damit auch sowas möglich ist:

    CVektor v1;

    CVektor v2 = -v1;

    So sieht es bis jetzt aus (Auszug)

    Im Headerfile:

    CVektor operator- (CVektor); // Subtraktion zweier Vektoren

    Im C++ File:

    CVektor CVektor::operator- (CVektor b)
    {
    CVektor c;

    c.m_x = m_x - b.m_x;
    c.m_y = m_y - b.m_y;
    c.m_z = m_z - b.m_z;
    if (m_w == 1.0 || b.m_w == 1.0) c.m_w = 1.0; // Mindestens ein Ortsvektor
    else c.m_w = 0.0; // Zwei Vektoren addieren

    return c;
    }

    Viele Dank im Voraus,

    Andreas



  • Da hast du sogar zwei Möglichkeiten dafür:

    CVector CVector::operator-()
    {
      return CVector(0)-*this;
    }
    //oder
    CVector CVector::operator-()
    {
      return -1 * *this;
    }
    

    (Alternativ kannst du auch globale Funktionen CVector operator-(const CVector& op); verwenden.



  • in deiner klasse:

    CVector operator-();
    

    achja: übergibt bitte bei dem anderen operator die parameter als konstante referenzen, also:

    CVektor operator- (const CVektor&);
    


  • und wenn du dir den Thread unter http://www.c-plusplus.net/forum/viewtopic-var-t-is-193021.html anschaust bzw.
    http://www.gotw.ca/gotw/004.htm Punkt 4, dann machst du operator- nicht zum member sondern ueberlaedst den globalen operator- fuer zwei CVector en 🙂



  • nur wenn das sinnvoll möglich ist. was es in diesem fall tatsächlich wäre, wenn man noch den operator+= als member-funktion implementierte.



  • CStoll schrieb:

    Da hast du sogar zwei Möglichkeiten dafür:

    CVector CVector::operator-()
    {
      return CVector(0)-*this;
    }
    //oder
    CVector CVector::operator-()
    {
      return -1 * *this;
    }
    

    Das ist aber nicht schön. Ich würde folgendes empfehlen:

    CVector CVector::operator -() const
    {
        return CVector(-m_x, -m_y, -m_z, -m_w);
    }
    

    Entsprechenden ctor natürlich vorausgesetzt. Der sollte aber sowieso existieren, notfalls non-public.


Anmelden zum Antworten