Array of vtkSmartPointers

Array of vtkSmartPointers

本文关键字:vtkSmartPointers of Array      更新时间:2023-10-16

在C 中编写程序。我有一个函数,可以创建多个vtkSmartPointers如下:

vtkSmartPointer< vtkMRMLLinearTransformNode > transformNode =
  vtkSmartPointer< vtkMRMLLinearTransformNode >::New();
vtkSmartPointer< vtkMRMLLinearTransformNode > transformNode2 =
  vtkSmartPointer< vtkMRMLLinearTransformNode >::New();

在此功能之外,我想具有vtkMRMLLinearTransformNodes的全局数组或向量,我可以将transformNodetransformNode2添加到。因此,在代码后面,我可以在另一个功能中访问它们。

我很难理解如何做到这一点。它超出了我在指针方面的专业知识。谁能帮我吗?一点解释也可以帮助我填补对vtkSmartPointers的理解的空白。

vtksmartpointers打算四处传递(复制),您也可以创建一个数组,或者更好的容器(例如,std :: vector)。

typedef vtkSmartPointer<vtkMRMLLinearTransformNode> NodePtr;
NodePtr CreateNode() {
  NodePtr node = NodePtr::New();
  node->ApplyTransform(xfm);
  return node;
}
std::vector<NodePtr> nodes;
for (int i = 0; i < nNodes; ++i) {
   nodes.push_back(CreateNode());
}

以相同的直观方式,您可以从函数返回SmartPointers的向量,或将其作为参数传递给另一个函数。

唯一危险的事情是在从功能返回时从VTKSMARTPOINTER下方的原始指针曝光。始终返回SmartPointer(就像上面的CreateNode()示例一样)。

vtkMRMLLinearTransformNode* BadFooWillCrash() {
   NodePtr node = NodePtr::New();
   // do something with node
   // the smart pointer will go out of scope and the object will be deleted!
   return node;
}

以原始指针为论点还不错。

void WorkNode(vtkMRMLLinearTransformNode* node) {
   // do something with node
}
NodePtr newNode = NodePtr::New();
WorkNode(newNode); 

同样,您可以将smartpointer作为参数

传递
void WorkNode2(NodePtr node) {
   // do something with node
}

这是因为在VTK中,参考计数器保留在对象本身内,因此Pointee对象知道有多少个指针指向它(您可以尝试GetReferenceCount()方法)。缺点是要由VTKSMARTPOINTER管理的对象必须从vtkobject派生。

您可以在这里找到一些更多信息http://www.vtk.org/wiki/vtk/tutorials/smartpointers