VTK智能指针——vtkSmartPointer

 VTK中的智能指针类为vtkSmartPointer,是一个模板类,继承自vtkSmartPointerSmart类。vtkSmartPointer类中定义一个vtkObjectBase类型的指针对象Object,用于存储智能指针中实际生成的对象。

vtkSmartPointer<vtkLight> light1 = vtkSmartPointer<vtkLight>::New();

 vtkSmartPointer中定义了静态函数New()来生成一个智能指针对象。该函数根据模板参数类型来生成一个对象,并将其保存在基类vtkSmartPoitnerBase的成员变量Object中。vtkSmartPointer重载了‘->’操作符,返回实际的模板类型的的对象,因此可以方便的访问对象的成员函数。如light->SetColor()

vtkSmartPointer<vtkLight> light1 = vtkSmartPointer<vtkLight>::New();
vtkSmartPointer<vtkLight> light2 = light1;

 vtkSmartPointer重载了赋值操作符,可以在vtkSmartPointer对象之间进行赋值。在赋值过程中,vtkSmartPointer会自动控制其内部对象指针Object的引用计数加1;上面代码中, light1和light2的引用计数最终都等于2。首先light1的vtkLight对象Object调用Register()自动将引用计数加1;然后将light2的object指向light1的Object对象。

vtkLight* light3 = vtkLight::New();
vtkSmartPointer<vtkLight> light4 = light3;

 可以将一个对象指针赋值给一个智能指针。light3赋值给light4之后,二者的引用计数都为2;

vtkSmartPointer<vtkLight> light1 = vtkSmartPointer<vtkLight>::New();
vtkLight* light2 = light1 ;

 此时light1直接将其内部对象Object返回,因此其引用参数并没有发生改变。但是这种情况需要注意,如果light1的生命周期结束后,会导致light2悬空,从而引发错误。
 当一个智能指针对象的生命周期结束时,会自动调用其析构函数释放内存。在析构函数中会调用内部对象object的UnRegister()函数修改(减少)引用计数。

![![![![![![图片说明](https://img-ask.csdn.net/upload/201605/30/1464617821_173174.jpg)图片说明](https://img-ask.csdn.net/upload/201605/30/1464617808_108129.jpg)图片说明](https://img-ask.csdn.net/upload/201605/30/1464617798_381636.jpg)图片说明](https://img-ask.csdn.net/upload/201605/30/1464617783_175564.jpg)图片说明](https://img-ask.csdn.net/upload/201605/30/1464617767_377094.jpg)图片说明](https://img-ask.csdn.net/upload/201605/30/1464617751_484068.jpg)![![图片说明](https://img-ask.csdn.net/upload/201605/30/1464617719_689853.jpg)图片说明](https://img-ask.csdn.net/upload/201605/30/1464617529_11835.jpg) 报错如下: 1>vtkSDIDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall vtkSmartPointerBase::vtkSmartPointerBase(void)" (__imp_??0vtkSmartPointerBase@@QAE@XZ),该符号在函数 "public: __thiscall vtkSmartPointer<class vtkImageData>::vtkSmartPointer<class vtkImageData>(void)" (??0?$vtkSmartPointer@VvtkImageData@@@@QAE@XZ) 中被引用 1>vtkSDIView.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall vtkSmartPointerBase::vtkSmartPointerBase(void)" (__imp_??0vtkSmartPointerBase@@QAE@XZ) 1>vtkSDIDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall vtkSmartPointerBase::~vtkSmartPointerBase(void)" (__imp_??1vtkSmartPointerBase@@QAE@XZ),该符号在函数 "public: __thiscall vtkSmartPointer<class vtkImageData>::~vtkSmartPointer<class vtkImageData>(void)" (??1?$vtkSmartPointer@VvtkImageData@@@@QAE@XZ) 中被引用 1>vtkSDIView.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall vtkSmartPointerBase::~vtkSmartPointerBase(void)" (__imp_??1vtkSmartPointerBase@@QAE@XZ) 1>vtkSDIDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class vtkSmartPointerBase & __thiscall vtkSmartPointerBase::operator=(class vtkObjectBase *)" (__imp_??4vtkSmartPointerBase@@QAEAAV0@PAVvtkObjectBase@@@Z),该符号在函数 "public: class vtkSmartPointer<class vtkImageData> & __thiscall vtkSmartPointer<class vtkImageData>::operator=(class vtkImageData *)" (??4?$vtkSmartPointer@VvtkImageData@@@@QAEAAV0@PAVvtkImageData@@@Z) 中被引用 1>vtkSDIDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class vtkSmartPointerBase & __thiscall vtkSmartPointerBase::operator=(class vtkSmartPointerBase const &)" (__imp_??4vtkSmartPointerBase@@QAEAAV0@ABV0@@Z),该符号在函数 "public: class vtkSmartPointer<class vtkImageData> & __thiscall vtkSmartPointer<class vtkImageData>::operator=(class vtkSmartPointer<class vtkImageData> const &)" (??4?$vtkSmartPointer@VvtkImageData@@@@QAEAAV0@ABV0@@Z) 中被引用 1>vtkSDIView.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: class vtkSmartPointerBase & __thiscall vtkSmartPointerBase::operator=(class vtkSmartPointerBase const &)" (__imp_??4vtkSmartPointerBase@@QAEAAV0@ABV0@@Z) 1>vtkSDIDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) protected: __thiscall vtkSmartPointerBase::vtkSmartPointerBase(class vtkObjectBase *,class vtkSmartPointerBase::NoReference const &)" (__imp_??0vtkSmartPointerBase@@IAE@PAVvtkObjectBase@@ABVNoReference@0@@Z),该符号在函数 "protected: __thiscall vtkSmartPointer<class vtkImageData>::vtkSmartPointer<class vtkImageData>(class vtkImageData *,class vtkSmartPointerBase::NoReference const &)" (??0?$vtkSmartPointer@VvtkImageData@@@@IAE@PAVvtkImageData@@ABVNoReference@vtkSmartPointerBase@@@Z) 中被引用 1>vtkSDIView.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) protected: __thiscall vtkSmartPointerBase::vtkSmartPointerBase(class vtkObjectBase *,class vtkSmartPointerBase::NoReference const &)" (__imp_??0vtkSmartPointerBase@@IAE@PAVvtkObjectBase@@ABVNoReference@0@@Z) 1>vtkSDIDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: static class vtkImageData * __cdecl vtkImageData::New(void)" (__imp_?New@vtkImageData@@SAPAV1@XZ),该符号在函数 "public: static class vtkSmartPointer<class vtkImageData> __cdecl vtkSmartPointer<class vtkImageData>::New(void)" (?New@?$vtkSmartPointer@VvtkImageData@@@@SA?AV1@XZ) 中被引用 1>vtkSDIDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class vtkImageData * __thiscall vtkImageAlgorithm::GetOutput(void)" (__imp_?GetOutput@vtkImageAlgorithm@@QAEPAVvtkImageData@@XZ),该符号在函数 "public: void __thiscall CvtkSDIDoc::OnFileOpen(void)" (?OnFileOpen@CvtkSDIDoc@@QAEXXZ) 中被引用 1>vtkSDIDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: static class vtkJPEGReader * __cdecl vtkJPEGReader::New(void)" (__imp_?New@vtkJPEGReader@@SAPAV1@XZ),该符号在函数 "public: static class vtkSmartPointer<class vtkJPEGReader> __cdecl vtkSmartPointer<class vtkJPEGReader>::New(void)" (?New@?$vtkSmartPointer@VvtkJPEGReader@@@@SA?AV1@XZ) 中被引用 1>vtkSDIView.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: static class vtkImageViewer2 * __cdecl vtkImageViewer2::New(void)" (__imp_?New@vtkImageViewer2@@SAPAV1@XZ),该符号在函数 "public: static class vtkSmartPointer<class vtkImageViewer2> __cdecl vtkSmartPointer<class vtkImageViewer2>::New(void)" (?New@?$vtkSmartPointer@VvtkImageViewer2@@@@SA?AV1@XZ) 中被引用 1>vtkSDIView.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: static class vtkRenderWindowInteractor * __cdecl vtkRenderWindowInteractor::New(void)" (__imp_?New@vtkRenderWindowInteractor@@SAPAV1@XZ),该符号在函数 "public: static class vtkSmartPointer<class vtkRenderWindowInteractor> __cdecl vtkSmartPointer<class vtkRenderWindowInteractor>::New(void)" (?New@?$vtkSmartPointer@VvtkRenderWindowInteractor@@@@SA?AV1@XZ) 中被引用 1>G:\Example_VTK\vtkSDI\vtkSDI\Debug\vtkSDI.exe : fatal error LNK1120: 10 个无法解析的外部命令 这是我第一个VTK与MFC集成的程序,后期要用这两个做医学图像处理。我基本上把网上与这个相关的方法都试,每次改动配置都会有新的错误出现,为了解决新的错误进行配置改动,最终又回到这个错误。 ``` ```
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页