2009-07-08 6 views
2

So bin ich ein wenig verwirrt, ich habe herum geschaut und versucht, einen passenden Weg zu finden, von std :: exception für meinen eigenen Typ zu erben. Nach cplusplus.com (und ich weiß, dass dies nicht unbedingt der Standard ist, deshalb frage ich), ist std :: exception eine Basisklasse ohne Mitglieder. Doch nach bei meiner Implementierung der Standardbibliothek (VS 2005) suchen, die Klasse std :: exception ganz klar mit zwei Membervariablen definiert:Vererbung von std :: exception, Mehrdeutigkeit in den Definitionen von std :: exception

class _CRTIMP_PURE exception 
    { // base of all library exceptions 
     ... 
private: 
    const char *_m_what; 
    int _m_doFree; 
    }; 

Nun ist diese Norm dieser Elemente innerhalb der Basis aufgenommen haben Klasse std :: Ausnahme, mein Verständnis war, dass es nicht ist. Mein Grund für die Frage ist, dass meine abgeleitete Ausnahmeklasse wirklich nur eine einzige Zeichenfolge für ihre Informationen benötigt, daher würde diese Implementierung gut funktionieren. Ich bin jedoch besorgt, dass dies nicht standardgemäß ist, und als solche könnte ich besser von std :: exception erben und die entsprechenden Mitglieder + Kopie/Zuweisung Code selbst hinzufügen.

+0

Da diese Mitglieder privat sind sie von Ihrer Version von vorgesehene Ausnahme nicht die Schnittstelle ändern. Die Interna von std :: exception sollten Sie nicht interessieren, nur seine öffentliche Schnittstelle ist von Bedeutung. –

Antwort

6

Die std::exception Klasse ist wie folgt definiert:

namespace std { 
    class exception { 
    public: 
     exception() throw(); 
     exception(const exception&) throw(); 
     exception& operator=(const exception&) throw(); 
     virtual ~exception() throw(); 
     virtual const char* what() const throw(); 
    }; 
} 

, dass der Vertrag, dass Sie leben müssen bis zu, wenn es darum geht, Ersetzbarkeit. Der Standard definiert die Besonderheiten jedes Mitglieds. Die einzige, die normalerweise berücksichtigt werden muss, ist, dass what() eine "Null-terminierte Multi-Byte-Zeichenfolge, geeignet für die Anzeige als wstring" zurückgibt. Der andere Teil gehorcht und stellt den throw() Vertrag sicher.

+0

Das war eigentlich eine andere Frage von mir, was genau meinst du mit dem "throw() Vertrag". Ich nehme an, es hat etwas damit zu tun, eine zusätzliche Ausnahme zu erzeugen, wenn die Ausnahmeklasse selbst etwas falsch macht? – DeusAduro

+0

throw() bedeutet, dass Ihre Implementierung keine Ausnahme auslösen darf. –

+1

Der Schwerpunkt auf der '' MUSS NICHT '' –

2

Um Ihre eigene Exception-Klasse zu machen, möchten Sie die folgende Funktion zu überlasten:

virtual const char* what() const throw() 

Wenn Sie an der Visual Studio Implementierung aussehen, exception verwendet malloc Speicher zuweisen die Zeichenfolge zu speichern. Wenn dieser Speicher nicht verfügbar ist, wird _m_what auf eine vordefinierte Zeichenfolge festgelegt. _m_doFree ist ein Flag, das speichert, ob free für diesen Speicher aufgerufen werden muss.

+0

Danke, und die Implementierung, die Sie dort oben hatten, ist das gleiche wie meins. Meine Frage ist mehr wie folgt: "Ich sehe, dass VS die 'what()' Fähigkeit in der Basisklasse implementiert hat, wenn ich dies ausnutzen will, werde ich Kompatibilitätsprobleme mit einem anderen Imp der std-Bibliothek bekommen " – DeusAduro

+0

@DeusAduro: Nein. Da es sich um private Mitglieder handelt, haben Sie keinen Zugriff darauf. Wenn Sie bei der Verwendung der öffentlichen Schnittstelle bleiben, ändern die internen privaten Mitglieder nicht, wie es über verschiedene Implementierungen hinweg funktioniert. –

1

Ich würde die anderen Standardausnahmen auch betrachten.
std :: Ausnahme möglicherweise die Basisklasse, aber andere Standardausnahmen bieten einige andere Funktionen.

leite ich in der Regel von std :: runtime_error

Verwandte Themen