vtkSmartPointer 数组

Array of vtkSmartPointers

正在用 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());
}

以同样直观的方式,您可以 return 来自函数的智能指针向量,或将其作为参数传递给另一个函数。

唯一危险的事情是在从函数 returning 时从 vtkSmartPointer 下面暴露原始指针。始终 return 智能指针(就像上面的 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); 

您也可以将智能指针作为参数传递

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

这是因为在vtk中引用计数器保存在对象本身内部,所以pointee对象知道有多少指针指向它(你可以试试GetReferenceCount()方法)。缺点是vtkSmartPointer要管理的对象必须派生自vtkObject。

您可以在此处找到更多信息 http://www.vtk.org/Wiki/VTK/Tutorials/SmartPointers