Überladen von static_cast?

8

Also, ich hatte neulich eine Prüfung, und eine der Fragen war etwas sehr ähnliches:

Wir haben eine Klasse namens Square , die eine Variable int side enthält. Wie können wir es möglich machen, dass cout << static_cast<int>(aSquare) <<endl; den Bereich eines Quadrats ausgibt?

Ist das überhaupt möglich?

    
Radix 10.12.2011, 17:52
quelle

3 Antworten

18

Das ist zwar möglich, aber nicht durch Überladen von static_cast<>() . Sie tun dies, indem Sie den Typcast-Operator überladen:

%Vor%

Achten Sie darauf, dass überlastete Typcast-Betreiber häufig mehr schaden als nützen. Sie machen viele unsinnige implizite Cast-Operationen möglich. Wenn Sie dieses Code-Snippet lesen, denken Sie "a wird den Bereich von s bekommen?"

%Vor%

Sicher nicht. Das macht Sinn und ist viel besser lesbar:

%Vor%

Ganz zu schweigen davon, dass Sie normalerweise auf andere Informationen über Square zugreifen möchten, wie GetSide() oder GetApothem() oder GetPerimeter() oder was auch immer. operator int() kann offensichtlich nur ein int zurückgeben, und Sie können nicht mehrere operator int() s als Mitglieder einer Klasse haben.

Hier ist eine weitere Situation, in der operator int() Code macht, der kompiliert, aber überhaupt keinen Sinn ergibt:

%Vor%

Was bedeutet es für ein Square , größer als 42 zu sein? Es ist Unsinn, aber mit dem operator int() wird der obige Code kompiliert, da Shape jetzt in ein int konvertierbar ist, das mit einem anderen int mit einem Wert 4 verglichen werden kann.

Schreib also keine Typcast-Operatoren. In der Tat, wenn Sie Typecast-Operatoren überlasten, möchten Sie vielleicht zweimal darüber nachdenken, was Sie tun. Es gibt nur wenige Fälle, in denen die Überlastung des Typecast-Operators im modernen C ++ nützlich ist (zB das sichere Bool-Idiom ).

    
In silico 10.12.2011, 17:55
quelle
4

Sie können den Darsteller überladen:

%Vor%

Das einzige Problem ist, dass es implizit verwendet wird, und Casting macht hier keinen Sinn. Sie können auch nicht zwischen den verschiedenen Arten von Umwandlungen unterscheiden (static_cast, c-style usw.)

Dies ist der bevorzugte Weg, um Dinge zu tun:

%Vor%

Wenn Sie eine Umwandlung verwenden müssen, verwenden Sie die C ++ 11-Funktion und markieren Sie sie als explicit . Dies verhindert implizite Casting-Fehler.

    
Pubby 10.12.2011 17:55
quelle
1

Sie könnten einen Konvertierungsoperator für die Square-Klasse bereitstellen:

%Vor%     
FailedDev 10.12.2011 17:55
quelle

Tags und Links