2009-04-03 7 views
6

stieß ich auf einige Codes, der folgend läuft darauf hinaus:Warum würden Sie die Links einer Aufgabe umsetzen?

enum BAR { /* enum values omitted */ } 

class Foo{ 
public: 
    void set(const BAR& bar); 
private: 
    uint32_t bits; 
}; 

void Foo::set(const BAR& bar) 
{ 
(uint32_t&)bits = bits | bar; 
} 

Ich verstehe nicht, den Punkt der c-Casts in der Zuordnung in Foo :: gesetzt. Warum würdest du die Links eines Auftrages werfen? Bin ich verrückt oder hat das einen Sinn?

+0

um Compiler-Warnungen über Präzisionsverlust zu vermeiden, vielleicht? Ich bin mir aber nicht so sicher. –

Antwort

8

In diesem Fall kann ich keinen Grund für den Cast sehen, da das zu verwerfende Objekt vom selben Typ ist wie der Cast. Im Allgemeinen könnte es verwendet werden, um einen bestimmten Zuweisungsoperator zu zwingen, verwendet zu werden.

Ich wiederhole jetzt mein Mantra: Wenn Ihr Code Casts enthält, stimmt wahrscheinlich etwas mit dem Code oder dem Design nicht und Sie sollten beide untersuchen, um den Cast zu entfernen.

+0

Ja. Beim letzten Mal habe ich die Win32-API verwendet. Irgendetwas stimmte nicht mit dem Code, und ich war es nicht. Wahrscheinlich eines der Dinge, die vor fünfzehn Jahren besser aussahen. –

+0

+1 für schönes Mantra. – bayda

-1

Wenn Sie nur zulassen möchten, dass ein bestimmter Wert zugewiesen wird (z. B. wird die Überprüfung der Zuweisung so vorgenommen, als ob die Variable wie in der Besetzung typisiert wäre, anstatt etwas durchzulassen, als ob Sie die rhs erweitert hätten).

0

Es macht überhaupt nichts, soweit ich das beurteilen kann, auch wenn BAR mit Werten außerhalb des uint32-Bereichs definiert ist. Sieht für mich wie Lärm aus.

2

Ich stimme mit Neil Butterworth, die Besetzung in diesem Fall ist nicht notwendig, und es ist eine eindeutige "Code-Geruch".

0

Ich kann nicht sicher sagen, ohne den Hintergrund zu kennen, aber es sieht so aus, als hätte jemand einen vorhandenen C-Code genommen und ihn in eine C++ - Klasse gehüllt. Die Besetzung kann ein Überbleibsel aus dem c-Code sein.

0

Ich bin mir nicht sicher, dass das legal ist. Ein Cast ist kein Lvalue ...

So oder so, es sieht ziemlich sinnlos aus.

Verwandte Themen