您的位置:首页 > 编程语言 > C语言/C++

VTK/VTK6 迁移/“工厂化”需要的定义

2016-07-22 16:28 260 查看
有时候会出现这种情况:“我的程序编译过了,链接也O了,但是New()缺返回了NULL”。

标准C++, New失败会抛出bad_alloc异常,但是有些编译器对C++支持不是很好,New失败可能不会抛出异常,而是返回0。较好的编程习惯为:

// 这样如果 new 失败了,就不会抛出异常,而是返回空指针
int* p = new (std::nothrow) int;
if ( NULL == p )
return -1;


VTK项目用CMake生成时,会使用标准的find_package(VTK)和include(${VTK_USE_FILE}),程序运行的时候也不会出错,(这些命令会自动给程序中添加定义 - 宏命令)。如果项目的新建不是使用CMake,需要结合模块实现指南

工厂方法要求在VTK配置时自动添加相关的模块。在不使用CMake生成解决方案时,为了使用不同的模块,需要定义一些宏。

2013年9月10号,(不知谁还是哪里?估计是官方)发布了一下宏命令,这个新的宏命令可以简化上面这个程序,应用中的一个源程序需要添加下面一段代码(用这个,所有的模块都应该会被初始化)

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);

这个片段代码会初始化vtkRenderingOpenGL这个对象工厂,其他的模块应该也是的。如果是VTK之前的版本(6.0或者是这个时间之前的版本),你可以在所有VTK头文件之前添加下面一段代码:

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)

其他的一些参考链接:

http://www.vtk.org/pipermail/vtkusers/2013-April/128255.html (已经无效了)
https://github.com/Kitware/VTK/commit/9385718b82e6af83b7e7dcc90a937419edc6892b
http://www.vtk.org/pipermail/vtkusers/2013-March/127811.html

遇到NULL指针时,可以让程序不编译,直接跳出来。这一步需要做一些选择(在window中,Visual studio 2008 V9 中项目右键菜单中: 属性页-->预定义)【这段不知道对错,下面的不翻译了没有意义】

PLUS: 还没有找到win7 x64 + VTK 7.0.0中需要用到的相关宏
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息