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:
codice:
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!";
}
}
Da cui ottengo il seguente output
Impossibile costruire prova!
Consigli, soprattutto legati alla possibilita' di casi futuri piu' complicati?