[Insight-developers] pure virtual methods vs exceptions throwing
Stephen R. Aylward
aylward@unc.edu
Wed, 27 Feb 2002 10:11:04 -0500
Luis,
I really like this design. Very nice!
Only other option would be to keep smart pointers from doing
construction...
Thanks,
Stephen
Luis Ibanez wrote:
>
> Bill,
>
> I have been hesitating about how to manage these cases
> and would appreciate any comments on how to do it better.
>
> It is happening now in Transforms, CostFuctions,
> Spatial Functions and a couple of other classes.
>
> The problem is:
>
> In order to remove template parameters we went back to
> classical C++ where we have hierarchies of classes (e.g.
> a hierarchy of transforms, a hierarchy of optimizers, a hierarchy
> of cost functions). Each hierarchy has a Base class that works
> as a generic representative of all the hierarchy members.
>
> Classes that require a Transform only keep a SmartPointer to
> the base class of the Transform hierarchy...and so on.
> At run time, the user will plug in a real functional member of the
> hierarchy into the pointer to the generic one and all the calls will
> be done via virtual functions.
>
> The Base classes of the hierarchy are quite dummy. They are
> devoid of all functionality in themselves and are never expected
> to be instantiated. So in principle most of their methods could
> be declared pure virtual:
>
> virtual method() = 0;
>
> but...
>
> For some reason, classes that hold smart pointer to these
> base classes try to instantiate them as construction time.
> That results in a message like:
>
> class YYY cannot be instantiated because
> the method ZZZ is abstract.
>
> This is triggered by the itkNewMacro() .... as current
> messages from the SGIs show in the dashboard.
>
> In order to avoid this, I removed pure virtual from methods
> in the base classes and wrote dummy implementations for them.
> This has the risk that classes deriving from them may forget
> to overload these dummy method and they may end up being
> called at run-time producing absurd results.
>
> So....I throw exceptions on them !
>
> These methos should never be called.
> If they are called that means that a derived class
> is not overloading a method that must be overloaded....
>
> If the run time test were crashing because of exceptions
> that means that some derived class was not being correctly
> implemented.
>
> ======================================
> To summarize:
>
> It looks like we have two options:
>
> 1) Go back to pure virtual methods (and find a workaround
> for the itkNewMacro() instantiation problem. That will give
> compile-time error is some derived class is not overloading
> the right methods.
>
> 2) Keep methods just virtual and do something to signal
> that this method should not be called... that can be:
> - Keep throwing exeptions.
> - Print some kind of message .. Warning.. Error....
> =======================================
>
> Any advice on this will be welcome !
>
> ===================================
> Lorensen, William E (CRD) wrote:
>
> >Luis,
> > Subclasses of CostFunction were throwing an exception if the method GetNumberOfParameters
> >was not defined. This was causing some optimizer tests to crash. These required methods should really
> >be pure virtual so that the compiler detects the missing method. I changed CostFunction to do this so
> >you may see a few more compile errors show up.
> >
> >Bill
> >_______________________________________________
> >Insight-developers mailing list
> >Insight-developers@public.kitware.com
> >http://public.kitware.com/mailman/listinfo/insight-developers
> >
>
> _______________________________________________
> Insight-developers mailing list
> Insight-developers@public.kitware.com
> http://public.kitware.com/mailman/listinfo/insight-developers
--
===============================================
Dr. Stephen R. Aylward
Assistant Professor of Radiology
Adjunct Assistant Professor of Computer Science
http://caddlab.rad.unc.edu
aylward@unc.edu
(919) 966-9695