Re: try block in constructor initialization
AlfC wrote:
Is is possible to do a try catch block in the constructor
initialization list and use an alternative initialization if first
failed?
Not directly, but you could hide it in a helper function.
For example:
H* CreateH1orH2(int a)
{
try {
return H1(a);
}
catch(...)
{
return H2();
}
}
class A{
A(int a) : impl_(CreateH1orH2(a))
{
}
std::auto_ptr<H> impl_;
};
class H{};
class H1 : public H{
H1(int a) : a_(a){ if(a==0) throw something();}
int a_;
}
class H2 : public H{
H2(){}
}
class A{
A(int a) try : impl_(new H1(a))
{
/*constructor using H1 succeeded*/
}
catch(...) impl_(new H2()){ // <-- syntax error, not possible to
use a different initialization
/*constructor using H1 failed*/
}
std::auto_ptr<B> impl_;
};
I understand that this is probably not the way to go, because if there
is an exception (caused by H1 constructor) then the construction of A
basically failed, but then I would forced to use assignment which I
wanted to avoid, so:
1) is there a way correct the code above and do that (alternative
initialization list)?
Not if you want the invocation of new in the initialiser list.
Otherwise, see my example with a helper function.
2) Would this be the recommended fix? (but uses assigment which I
didn't like but I am not sure)
A(int a) : impl_(0){
try{
impl_=new H1(a);
}catch(...){
impl_=new H2();
}
}
It is a possible alternative, with the drawback you already mentioned.
3) could it be that the solution is following?
A(int a) : impl_(a>0?new H1(a):new H2()){}
which I tried to avoid because it repeats the constrains on H1 and
is more difficult to maintain, and conceptually A shouldn't known
about the internal implementation of H, H1 and H2, it seems to put the
constrains of the H1 on the constructor and not somewhere else.
You can avoid this knowledge of constraints, if you add a static member
bool H1::CanCreate(int a) to H1. Then you could write:
A(int a) : impl_(H1::CanCreate(a)?new H1(a):new H2()) {}
This way, the knowledge of the constraints can be fully localised in H1.
4) Is there any other alternative that you can imagine?
Yes, as outlined above.
Thank you,
Alfredo
Bart v Ingen Schenau
--
a.c.l.l.c-c++ FAQ: http://www.comeaucomputing.com/learn/faq
c.l.c FAQ: http://c-faq.com/
c.l.c++ FAQ: http://www.parashift.com/c++-faq-lite/
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]