2012-04-08 8 views
0

Ich habe eine Klasse, deren einzige Datenelement eine 32-Bit-Ganzzahl ohne Vorzeichen ist. Das heißt, sieht die Klasse wie folgt:Umwandlung von einer const benutzerdefinierten Klasse in einen eingebauten Typ in C++

class A { 
protected: 
    unsigned int bits; 
    /* ... some methods ... */ 
public: 
    /* ... some methods ... */ 
}; 

Aber ich will es auch in der Lage sein, implizit zu und von 32-Bit-Integer ohne Vorzeichen zu konvertieren. So habe ich in einem Copy-Konstruktor sowie ein Casting-Operator:

class A { 
protected: 
    unsigned int bits; 
    /* ... some methods ... */ 
public: 
    A(): bits(0) {} // default constructor 
    A(const unsigned int i): bits(i) {} // convert from unsigned int to A 
    operator unsigned int() { return bits; } // convert from A to unsigned int 
    /* ... some methods ... */ 
}; 

So, jetzt zum Beispiel, kann ich die folgenden Dinge tun:

int main() { 
    // default constructor 
    A a0 = A(); 
    // convert from unsigned int 
    A a1 = 1 + 2; 
    // conversions between the two types: 
    unsigned int result = (a0 & a1 + 5)/2; 
} 

aber ich bin zu kämpfen, um es zu arbeiten mit const Typen. Insbesondere arbeiten die folgenden nicht:

int main() { 
    const A a = 5;  // works 
    unsigned int i = a; // compiletime error 
} 

Er sagt: „Keine geeignete Konvertierungsfunktion von‚const A‘bis‚unsigned int‘existiert.“. Ich verwende Visual Studio 2010 mit dem Standardcompiler von Microsoft.

Welche Konvertierungsfunktion muss ich erstellen, damit sie ordnungsgemäß funktioniert?

+0

Re: "Aber ich will es auch in der Lage sein, zu und von 32 Bit vorzeichenlosen Ganzzahlen implizit zu konvertieren." Sei vorsichtig mit dem was du verlangst. Implizite Conversions werden Sie in den Hintergrund drängen, wenn Sie es am wenigsten erwarten, und erfahrene C++ - Programmierer vermeiden es oft, implizite Conversions in ihren Klassen zuzulassen, außer in nur wenigen Fällen. Welchen Vorteil haben Sie, wenn Sie diese Art von impliziter Konvertierung für Klasse A zulassen? –

+0

@Insilico: Cleanerer Code, da ich nicht überall Castes schreiben muss, wenn ich Operationen an den Bits durchführe. – Cam

+0

Und öffentliche Methoden oder Operatorüberladung zu implementieren, um diese Bit-Operationen sind nicht ausreichend? –

Antwort

3

Deklarieren Sie den Konvertierungsoperator const:

operator unsigned int() const { return bits; } 

Caveat: Implizite Konvertierung Betreiber fast immer eine schlechte Idee sind. Die Gefahren überwiegen in der Regel weit über die kleine Unannehmlichkeit, eine einfache alte Memberfunktion aufrufen:

unsigned int asInt() const { return bits; } 
⋮ 
unsigned int i = a.asInt(); 

Die ultimative Lösung, wenn Sie C 11 ++ ist eine explizite Umwandlungsoperator zu erklären:

explicit operator unsigned int() const { return bits; } 
⋮ 
unsigned int i = static_cast<int>(a); 
+1

Danke! Macht Sinn. Ich akzeptiere Ihre Antwort nach Ablauf der Frist, aber können Sie näher darauf eingehen, warum es so gefährlich ist? – Cam

+0

In Bezug auf den expliziten Konvertierungsoperator - sehr cool, aber wenn ich das tue, muss ich 'static_cast' jedes Mal, wenn ich einen der unsigned int-Operatoren für ein A-Objekt verwende, was ich lieber nicht machen würde. Können Sie näher auf die Gefahren eingehen, die solche impliziten Konvertierungen in dieser Situation zulassen? – Cam

+0

@Cam: Es ist nicht * unglaublich * gefährlich, nur Plain Vanilla gefährlich, und die Alternative ist so eine kleine Zumutung, dass es normalerweise nicht das Risiko wert ist.Sie sollten die Sicherheit niemals gegen einen geringen Komfortgewinn eintauschen. –

Verwandte Themen