VTK的对象模型

可以将VTK对象模型视为继承自超类vtkObject。几乎所有VTK类都派生自该类,某些特殊情况下派生自其超类vtkObjectBase。所有VTK都必须使用对象的New()方法创建,并且必须使用对象的Delete()方法销毁。无法在堆栈上分配VTK对象,因为构造函数是protected方法。使用一个通用的超类和创建和销毁对象的统一方法,VTK提供面向对象的几个基本操作。

引用计数.对象显式存储引用它们的指针数。通过类的静态New()方法创建对象时,其初始引用计数为1,因为必须使用原始指针来引用新对象:

vtkObjectBase* obj = vtkExampleClass::New();

创建或销毁对象的其他引用时,使用Register()和UnRegister()方法递增或递减引用计数。通常,这由对象API中提供的各种“set”方法自动处理:

otherObject->SetExample(obj);

引用计数现在是2,因为原始指针和存储在另一个对象中的指针都引用它。当不再需要最初存储对象的原始指针时,将使用Delete()方法删除引用:

obj->Delete();

此后,使用原始指针访问对象不再安全,因为指针没有对其的引用。为了确保正确管理对象引用,每次对New()的调用都必须与以后对Delete()的调用配对,以确保没有引用泄漏。类模板vtkSmartPointer<>提供了“智能指针”实现,简化了对象管理。可以重写上述示例:

vtkSmartPointer obj = vtkSmartPointer::New();

otherObject->SetExample(obj);

在这种情况下,智能指针会自动管理其拥有的引用。当智能指针变量超出范围且不再使用时,例如当它是局部变量的函数返回时,它会通过减少引用计数自动通知对象。通过使用智能指针提供的静态New()方法,任何原始指针都不需要保存对对象的引用,因此不需要调用Delete()

运行时类型信息. 在C++中,对象的实际类型可能不同于用于引用它的指针类型。VTK公共接口中的所有类都有简单的类名标识符(没有模板),所以一个字符串就足以识别它们。可以在运行时使用GetClassName()方法获取VTK对象的类型:

const char* type = obj->GetClassName();

可以使用IsA()方法测试对象是否是特定类或其子类的实例:

if(obj->IsA("vtkExampleClass")) { ... }

使用派生类型的类提供的静态SafeDownCast()方法,可以将超类类型的指针安全地转换为派生的类型:

vtkExampleClass* example = vtkExampleClass::SafeDownCast(obj)

只有当对象确实是派生类型的实例时,此操作才会在运行时成功,否则将返回空指针。

对象状态展示. 调试时,显示对象当前状态的可读描述通常很有用。这可以使用Print()方法为VTK对象获取:

obj->Print(cout);

你可能感兴趣的:(VTK进阶之路,c++)