在C 中编写程序。我有一个函数,可以创建多个vtkSmartPointers
如下:
vtkSmartPointer< vtkMRMLLinearTransformNode > transformNode =
vtkSmartPointer< vtkMRMLLinearTransformNode >::New();
vtkSmartPointer< vtkMRMLLinearTransformNode > transformNode2 =
vtkSmartPointer< vtkMRMLLinearTransformNode >::New();
在此功能之外,我想具有vtkMRMLLinearTransformNodes
的全局数组或向量,我可以将transformNode
和transformNode2
添加到。因此,在代码后面,我可以在另一个功能中访问它们。
我很难理解如何做到这一点。它超出了我在指针方面的专业知识。谁能帮我吗?一点解释也可以帮助我填补对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