2017-03-01 7 views
0

C++로 프로그램 작성. 내가 transformNodetransformNode2를 추가 할 수 vtkMRMLLinearTransformNodes의 글로벌 배열 또는 벡터를 갖고 싶어이 함수의 외부배열 vtkSmartPointers

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

: 나는 다음과 같은 몇 가지 vtkSmartPointers를 생성하는 기능을 가지고있다. 그래서 나중에 코드에서 다른 함수로 액세스 할 수 있습니다.

내가 어떻게하는지 이해하는 데 어려움이 있습니다. 그것은 내 수준의 전문성을 넘어서고 있습니다. 누구든지 나를 도울 수 있습니까? 약간의 설명은 또한 내 이해의 차이를 채우는 데 도움이 될 vtkSmartPointers.

답변

0

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 밑에서 원시 포인터를 노출하는 것입니다. 항상 위의 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

+0

이 도움을 주셔서 감사합니다 여기에서 찾을 수 있습니다. 이것은 명확하게 나의 이해의 틈새를 메웠다. – bdan629

+0

다행이었습니다 :) – mirni