vtkSmartPointer 数组
Array of vtkSmartPointers
正在用 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());
}
以同样直观的方式,您可以 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
正在用 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());
}
以同样直观的方式,您可以 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