Mi stavo ponendo il problema di come cautelarmi nei confronti di possibili fallimenti del costruttore di un oggetto.
Ho fatto questo codice di prova:
codice:class Prova { public: Prova(std::vector<int> values) { try { if(values.size()!=3) { throw 0; } else { a=values[0]; b=values[1]; c=values[2]; } } catch(...) { std::cout<<"\nImpossibile costruire prova!"; } }; void view() { std::cout<<"\nvalore di a: "<<a; std::cout<<"\nvalore di b: "<<b; std::cout<<"\nvalore di c: "<<c; }; private: int a; int b; int c; }; int main() { Prova prova(std::vector<int> {1,2,3,4,5,6}); prova.view(); }
ed ottengo il seguente output
Impossibile costruire prova!
valore di a: 0
valore di b: 0
valore di c: 0
nonchè i seguenti warning:
In function 'int main()':
33:39: warning: 'prova.Prova::c' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::c' was declared here
32:39: warning: 'prova.Prova::b' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::b' was declared here
31:39: warning: 'prova.Prova::a' may be used uninitialized in this function [-Wmaybe-uninitialized] 45:11: note: 'prova.Prova::a' was declared here
e così non è un buon comportamento...ho dei valori per a,b e c quando invece l'oggetto non dovrebbe essere stato nemmeno creato.
Mi pare piu' 'cautelativo' implementare l'eccezione nel seguente modo:
Da cui ottengo il seguente outputcodice:class Prova { public: Prova(std::vector<int> values) { if(values.size()!=3) { throw 0; } else { a=values[0]; b=values[1]; c=values[2]; } }; void view() { std::cout<<"\nvalore di a: "<<a; std::cout<<"\nvalore di b: "<<b; std::cout<<"\nvalore di c: "<<c; }; private: int a; int b; int c; }; int main() { try { Prova prova(std::vector<int> {1,2,3,4,5,6}); prova.view(); } catch(...) { std::cout<<"\nImpossibile costruire prova!"; } }
Impossibile costruire prova!
Consigli, soprattutto legati alla possibilita' di casi futuri piu' complicati?

Rispondi quotando
