2017-11-27 2 views
-2

Ich habe einen Konstruktor, der eine Ausnahme auslösen könnte, es ist mein Verständnis, dass, sobald dies auftritt, der Dekonstruktor aufgerufen wird. Das Problem ist, dass ich keine Ahnung habe, wie überprüft werden kann, ob das Objekt tatsächlich erfolgreich erstellt wurde.C++ Wie kann die Ausführung bei der Konstruktion fehlgeschlagener Objekte angehalten werden?

versuchte ich

if (objectName) { 
    //keep working 
} else { 
    //alert that something went wrong 
} 

tun Aber ich habe gelernt, dass man nicht eine „Null“ Objekt in C++ wie möglich in Java als ein Zeiger immer vielleicht haben existiert, aber auf etwas hinweisen, die Sie nicht tun wollen.

Also dann habe ich auch versucht, einen zusätzlichen Versuch zu fangen um die Objekt Instanziierung, aber die Ausführung einfach weiter so normal. Was ist die beste Vorgehensweise, um zu überprüfen, ob ein Objekt erfolgreich erstellt wurde und verwendet werden kann?

+3

Das Objekt ist vollständig konstruiert, wenn die Ausnahme nicht ausgelöst wird. –

+3

Wenn Ihr Konstruktor einen Fehler verursacht, können Sie immer die Ausnahme abfangen. Veröffentlichen Sie einen echten Code, der veranschaulicht, was Sie tun. –

+0

Die beste Übung ist nicht zu werfen, es sei denn, du musst unbedingt. Lesen Sie auch dies: http://www.stroustrup.com/bs_faq2.html#ctor-exceptions –

Antwort

3
try { 
    Type obj; 
    //keep working 
} 
catch (/* ... */) { 
    //alert that something went wrong 
} 

obj ist nur sichtbar innerhalb der try Block. Wenn der Konstruktor löst, verlassen Sie den try Block und somit existiert obj nicht. Es gibt also keine Vorstellung von einer "Null-Instanz". Entweder obj existiert und ist gültig, oder es existiert nicht, weil die Ausnahme dazu führte, dass der Block try verlassen wurde.

+0

Danke für die Antwort, das ist eigentlich was ich getan habe, wie ich beschrieben habe, sehr schlecht, im zweiten Teil meiner Frage. Das Problem besteht darin, dass der Code innerhalb des Befehls weiterhin ausgeführt wird, unabhängig davon, ob das Objekt den Fehler verursacht oder nicht, was könnte das verursachen? – Daniel

+1

@Daniel Das ist nicht möglich. Wenn der Konstruktor ausgibt, springt das Programm direkt zur 'catch'-Anweisung. Die einzige vernünftige Erklärung hier ist, dass Sie falsch interpretieren, was passiert. Sind Sie wirklich sicher, dass der Konstruktor ('Type :: Type()' in diesem Fall) eine Ausnahme auslöst? –

+0

Hallo, ich habe es herausgefunden, überprüfe meine Antwort unten. Am Ende gibt es auch eine Frage, die ich gerne beantworten würde. – Daniel

Verwandte Themen