Operator überladen



  • Hallo!

    Ich will den >Operator meiner Klasse überladen(als Methode). Ich habe es so gemacht und es geht:

    bool Automobile::operator >(const Automobile &oper){
    	//Funktion fehlt
    	return true;
    }
    

    Jedoch möchte ich meine Methode dazu benutzen um den Typ meines Objektes zu bestimmen, das mache ich mit Downcast. Bei meiner if-Anweisung wäre es aber besser wenn ich mit Zeigern arbeite, da es ja keine Null Referenzen gibt und mir die if in bestimmten Fällen eine bad_cast Ausnahme liefern würde.

    Ich habe es jetzt so umgeschrieben:

    bool Automobile::operator >(const Automobile *oper){
    
    	if(const Car* obj = dynamic_cast<const Car*>(oper))
    		cout << "Car Objekt!";
    	else cout << "kein Car Objekt"; 
    
    	return true;
    }
    

    Er meldet mir keinen Fehler jedoch wird beim Aufruf des > Operator nicht diese Methode verwendet. Dies führt zu meiner ersten Frage: muss die Methode aus einem Parameter bestehen der eine "const" Referenz ist?

    Zweitens: Kann ich diese Methode des Downcast mit Zeigern auch mit dem Referenzparameter realisieren?

    Anmerkung: Die eigentliche Funktion des > Vergleichs muss ich erst machen...

    Mfg
    Dosunmu



  • bool Automobile::operator >(const Automobile& op)
    {
        if (dynamic_cast<const Car*>(&oper) == NULL)
            std::cout << "Kein ";
        std::cout << "Car Objekt!" << std::endl;
    
        return true;
    }
    

    😉 hmm obwohl ... ist schwachsin ^^



  • Wieso benützt er nicht die überladene Methode wenn der > Operator aufgerufen wird?

    bool Automobile::operator >(const Automobile *oper){ 
    
        if(const Car* obj = dynamic_cast<const Car*>(oper)) 
            cout << "Car Objekt!"; 
        else cout << "kein Car Objekt"; 
    
        return true; 
    }
    


  • Weil du vermutlich nicht mit einem Pointer vergleichst 🙄

    ansonsten wäre es nicht schlecht den op> für Car zu überladen, anstelle eine dynamic_cast-Bastelei zu nehmen...



  • rüdiger schrieb:

    ansonsten wäre es nicht schlecht den op> für Car zu überladen, anstelle eine dynamic_cast-Bastelei zu nehmen...

    Genau. In den meißten Fällen ist die Benutzung von dynamic_cast überflüssig und deutet auf ein Design-Fehler hin.

    Kann man meißtens auch alles schön mit virtuellen Funktionen anders lösen ...



  • Ich sehe hier drei Mankos.

    Erstens, binäre non-assignment Operatoren solltest du eher global überladen. Bedenke, nicht nur a op b soll funktionieren, sondern auch b op a. Klassenseitig kannst du jedenfalls nur eines davon abdecken.

    Zweitens, die Idee mit Zeigern als Parameter solltest du besser verwerfen, denn damit bekommst du spätestens bei der globalen Definition Probleme. Der Compiler kocht halt sein eigenes Süppchen mit Zeigern. Nimm Referenzen!

    Und drittens,

    rüdiger schrieb:

    ansonsten wäre es nicht schlecht den op> für Car zu überladen, anstelle eine dynamic_cast-Bastelei zu nehmen...


Anmelden zum Antworten