Ich versuche zwischen zwei Möglichkeiten der Instanziierung eines Objekts & zu entscheiden, das alle Konstruktorausnahmen für ein für mein Programm kritisches Objekt behandelt, dh wenn die Konstruktion fehlschlägt, kann das Programm nicht fortgesetzt werden .Guter Stil für den Umgang mit Konstruktorfehler des kritischen Objekts
Ich habe eine Klasse SimpleMIDIOut, die grundlegende Win32 MIDI-Funktionen umschließt. Es öffnet ein MIDI-Gerät im Konstruktor und schließt es im Destruktor. Es wird eine Exception ausgelöst, die von std :: exception im Konstruktor geerbt wird, wenn das MIDI-Gerät nicht geöffnet werden kann. wäre im Einklang mit C++ Best Practices
Methode 1
Welche der folgenden Möglichkeiten, für diesen Objektkonstruktor Ausnahmen fangen - Stapel reserviert Objekt, nur in ihrem Umfang innerhalb try-Block
#include <iostream>
#include "simplemidiout.h"
int main()
{
try
{
SimpleMIDIOut myOut; //constructor will throw if MIDI device cannot be opened
myOut.PlayNote(60,100);
//.....
//myOut goes out of scope outside this block
//so basically the whole program has to be inside
//this block.
//On the plus side, it's on the stack so
//destructor that handles object cleanup
//is called automatically, more inline with RAII idiom?
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
std::cin.ignore();
return 1;
}
std::cin.ignore();
return 0;
}
Methode 2 - Zeiger auf Objekt, Heap allokiert, schöner strukturierter Code?
#include <iostream>
#include "simplemidiout.h"
int main()
{
SimpleMIDIOut *myOut;
try
{
myOut = new SimpleMIDIOut();
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
delete myOut;
return 1;
}
myOut->PlayNote(60,100);
std::cin.ignore();
delete myOut;
return 0;
}
Ich mag das Aussehen des Codes in Methode 2 besser, nicht über mein ganzes Programm in einen try-Block stauen, aber Methode 1 erstellt das Objekt auf dem Stapel so C++ die Lebensdauer des Objekts verwaltet, Das passt besser zur RAII-Philosophie, oder?
Ich bin immer noch ein Neuling in diesem so jede Rückmeldung über die oben genannten wird sehr geschätzt. Wenn es einen noch besseren Weg gibt, den Konstruktorfehler in einer solchen Situation zu prüfen/behandeln, lass es mich wissen.
+1 für eine gut gestellte erste Frage. – razlebe