[Insight-developers] MakeOutput : Raw pointer... Smart pointer ?
Luis Ibanez
luis.ibanez at kitware.com
Sat Apr 2 08:17:51 EDT 2011
Hi Antonin,
1) MakeOutput returns a SmartPointer,
the function signature is:
DataObjectPointer MakeOutput(unsigned int idx)
3) Smart Pointers do not support casting from
derived classes.
For example
typedef itk::ImageBase< 3 > ImageBaseType;
typedef itk::Image< unsigned short, 3 > ImageType;
ImageType::Pointer image = ImageType::New();
ImageBaseType::Pointer baseImage = image;
Will fail compilation with the message:
conversion from ‘itk::SmartPointer<itk::Image<short unsigned int, 3u> >’ to
non-scalar type ‘itk::SmartPointer<itk::ImageBase<3u> >’ requested
While the code:
typedef itk::ImageBase< 3 > ImageBaseType;
typedef itk::Image< unsigned short, 3 > ImageType;
ImageType::Pointer image = ImageType::New();
ImageBaseType::Pointer baseImage = image.GetPointer();
will compile and work fine.
-----
With SmartPointers you can't assign the smartpointer of a
derived class to the smartpointer of a base class.
With SmartPointers you can assigne the RAW pointer of a
derived class to the smartpointer of a base class.
That's the reason why GetPointer() is used in MakeOutput().
3) That said, the particular example that you are
looking at, has some unnecessary GetPointer() calls.
Particularly, the one in the return statement is not
needed.
The code:
> ::MakeOutput(unsigned int idx)
> {
> DataObject::Pointer output;
>
> switch ( idx )
> {
> case 0:
> output = ( EigenValueImageType::New() ).GetPointer();
> break;
> case 1:
> output = ( EigenValueImageType::New() ).GetPointer();
> break;
> case 2:
> output = ( EigenVectorImageType::New() ).GetPointer();
> break;
> }
> return output.GetPointer();
> }
>
Should just be:
> ::MakeOutput(unsigned int idx)
> {
> DataObject::Pointer output;
>
> switch ( idx )
> {
> case 0:
> output = ( EigenValueImageType::New() ).GetPointer();
> break;
> case 1:
> output = ( EigenValueImageType::New() ).GetPointer();
> break;
> case 2:
> output = ( EigenVectorImageType::New() ).GetPointer();
> break;
> }
> return output;
> }
>
Given that the "output" variable already
has the same type as the expected return
type of the function.
The calls
output = ( EigenValueImageType::New() ).GetPointer();
Need the GetPointer() method, because "output"
is a smart pointer to DataObject, and the
EigenValueImageType is a derived class from
DataObject.
Luis
----------------------------------------------
On Fri, Apr 1, 2011 at 11:57 AM, Antonin Perrot-Audet
<antonin07130 at gmail.com> wrote:
> Hello,
>
> I still have trouble understanding the function of
> ProcessObject::MakeOutput
> method.
>
> I have a filter with multiple outputs, and I must admit that I have trouble
> understanding the principle of the example provided in
> itkEigenAnalysis2DImageFilter
> MakeOutput seems to *return a RAW pointer instead of a SMART POINTER* ?
>
> template< class TInputImage, class TEigenValueImage, class TEigenVectorImage
>>
> DataObject::Pointer
> EigenAnalysis2DImageFilter< TInputImage, TEigenValueImage, TEigenVectorImage
>>
> ::MakeOutput(unsigned int idx)
> {
> DataObject::Pointer output;
>
> switch ( idx )
> {
> case 0:
> output = ( EigenValueImageType::New() ).GetPointer();
> break;
> case 1:
> output = ( EigenValueImageType::New() ).GetPointer();
> break;
> case 2:
> output = ( EigenVectorImageType::New() ).GetPointer();
> break;
> }
> return output.GetPointer();
> }
>
> Can anyone give me more insights about *when to return smart pointers and
> raw pointers* ?
>
> Thanks,
> --
> Antonin
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-developers
>
>
More information about the Insight-developers
mailing list