Próbuję wybrać między dwoma sposobami tworzenia wystąpienia obiektu & z obsługą wyjątków konstruktora dla obiektu, który jest krytyczny dla mojego programu, tj. Jeśli konstrukcja nie powiedzie się, program nie może kontynuować .Dobry styl postępowania z uszkodzeniem konstruktora krytycznego obiektu
Mam klasę SimpleMIDIOut, która otacza podstawowe funkcje Win32 MIDI. Otworzy ono urządzenie MIDI w konstruktorze i zamknie je w destruktorze. Przekaże wyjątek odziedziczony po std :: exception w konstruktorze, jeśli nie można otworzyć urządzenia MIDI.
Które z poniższych sposobów łapania wyjątków konstruktora dla tego obiektu byłoby bardziej zgodne z najlepszymi praktykami C++
metoda 1 - Stack przydzielonego obiektu, tylko w zakresie wewnątrz bloku try
#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;
}
Metoda 2 - Wskaźnik do obiektu, przydzielone sterty, ładniejszy kod strukturalny?
#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;
}
lubię wygląd kodu w metodzie 2 lepiej, nie trzeba zaciąć cały mój program w bloku try, ale Metoda 1 tworzy obiekt na stosie tak C++ zarządza czas życia obiektu, co jest bardziej zgodne z filozofią RAII, nieprawdaż?
Nadal jestem nowicjuszem, więc wszelkie opinie na temat powyższego są mile widziane. Jeśli istnieje jeszcze lepszy sposób sprawdzenia/poradzenia sobie z awarią konstruktora w takiej sytuacji, proszę dać mi znać.
+1 za dobrze zadane pierwsze pytanie. – razlebe