2015-10-09 13 views
5

ich qt Quellen lese, und ich habe einen Code wie dies viele Male gesehen:Explicit operator = Aufruf (T :: operator =)

buttonOpt.QStyleOption::operator=(*opt); 

Also, ich denke, es ist so etwas wie buttonOpt = *opt aber warum Sie verwenden diese Syntax anstelle von Standard und benutzerfreundlich? Ist das schneller oder gibt es einen anderen Gewinn?

Antwort

8

Dies ist, weil sie explizit die operator= von der Basisklasse buttonOpt aufrufen, die QStyleOption ist.

buttonOpt.QStyleOption::operator=(*opt); 

//similar behavior 
class Base 
{ 
public: 
    virtual bool operator<(Base & other) 
    { 
     std::cout << "Base"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    bool operator<(Base & other) override 
    { 
     std::cout << "Derived"; 
    } 
}; 

int main() 
{ 
    Derived a; 
    Derived b; 
    a < b; //prints "Derived" 
    a.Base::operator <(b); //prints "Base" 
} 
5

Der Code, den Sie zeigen, wird ausdrücklich auf die Basisklasse Zuordnung aufrufen, das heißt nur die Basisklasse Teile der QStyleOptionButton zugewiesen bekommen, nicht aber die Membervariablen des Objekts.

Es ergibt sich aus der Dokumentation, dass kein operator= für QStyleOptionButton deklariert wird, so dass, wenn man die übliche Zuordnung auf ein solches Objekt nennen würde, versuchen würde der Compiler einen solchen Operator zu erzeugen, der Zuordnung jeder Basisklasse subobject aus und jede Mitgliedsvariable.

Ein solcher generierter Operator kann oder kann nicht kompilieren, abhängig davon, ob alle Member und Basisklassen kopierbar sind. In solchen Fällen ist es üblich, den Operator manuell zu definieren, um die Zuweisung korrekt durchzuführen, wenn die Klasse überhaupt kopierbar sein soll.

Der wahrscheinliche Grund, die Basisklassenzuweisung explizit aufzurufen, besteht jedoch darin, dass nur die Basisklassenbestandteile kopiert werden müssen, während die anderen Klassenmitglieder nicht geändert werden sollten. Dies ist also keine "echte Zuweisung" semantischer Sinn.

+0

Dies ist eine gute Antwort, obwohl die angenommene Antwort korrekt ist, erklärt diese Antwort das Warum. –