2013-10-19 3 views
1

GetConnections 메서드에서 connections의 정확한 복사본을 반환한다는 것을 확인하고 싶습니다. 기존 노드 외부에서 편집 할 것이며 메모리 위치에 대한 포인터를 반환하면 (예 : 노드의 벡터 편집) 내 프로그램이 작동하지 않을 가능성이 높습니다. 복제품/사본과 포인터가 아닌 자신을 반환하려면 어떻게해야합니까? 즉, 여기에 문제가되지 않습니다 그래서반환 값이 포인터가 아닌지 확인

std :: vector<NodeConnection*> Node :: GetConnections() 
{ 
    return this->connections; 
} 


class Node { 
    private: 
     std :: vector <NodeConnection*> connections; 
    public: 
     // getters 
     std :: vector <NodeConnection*> GetConnections(); 
}; 

벡터 자체의 NodeConnection*은 편집 할 수 없습니다.

+1

포인터를 반환하지 않고 복사본을 반환합니다. – 0x499602D2

답변

2

당신은 당신이 함수 서명을보고 반환하는 것을 알 수 있습니다 :

  1. SomeType* functionName(ArgType arg)을 - 함수는 포인터를 반환한다. 포인터가 가리키는 것이 무엇이든 호출자가 수정할 수 있습니다.
  2. SomeType const * functionName(ArgType arg) -이 함수는 const에 대한 포인터를 반환합니다. 포인터가 가리키는 것이 무엇이든 조사 할 수는 있지만 호출자가 포인터를 수정할 수는 없습니다.
  3. SomeType& functionName(ArgType arg) - 함수가 참조를 반환합니다. 참조가 참조하는 것이 무엇이든 호출자가 수정할 수 있습니다.
  4. const SomeType& functionName(ArgType arg) -이 함수는 const 참조를 반환합니다. 참조가 참조하는 것이 무엇이든 조사 할 수는 있지만 호출자가 수정할 수는 없습니다.
  5. SomeType functionName(ArgType arg) - 함수는 사본을 반환합니다. 호출자가 반환 값에 대해 수행 할 수있는 수정 사항은 반환되는 원본에 반영되지 않습니다.

함수의 리턴 유형은 다섯 번째 종류의 리턴 유형입니다. 값으로 반환합니다. 즉, 코드는 포인터 벡터의 복사본을 만듭니다. 호출자가 클래스 내부의 벡터를 수정할 수는 없지만 벡터의 요소가 가리키는 객체의 메소드를 확실히 호출 할 수 있습니다. 이러한 메소드 중 일부가 항목을 변경하면 원래 벡터의 항목에도 이러한 변경 사항이 표시됩니다. 즉, 포인터 벡터를 복사 할 때 얕은 사본이 생깁니다.

const 또는 const 참조에 대한 포인터를 반환하면 복사본을 피할 수 있으므로 효율성이 높아 동일한 결과가 나타납니다. 원하는 경우 복사본을 반환 할 필요가 없습니다.

+0

이 경우 사본이 필요하므로 다섯 번째 유형이 가장 효과적입니다. 자세한 설명을 주셔서 감사합니다. – bas

관련 문제