2014-04-13 4 views
1

벡터를 저장하는 클래스가 있습니다. 그리고 나는 그것에 대한 게터를 가지고있다.C++ getter 임시 참조 대 const 참조

getPoints()를 호출하면 임시 객체가 반환 될까요? 아니면 그냥 복사할까요?
대신 const 참조를 반환해야합니까?

UPDATE


그리고 내가 또한 게터가 내 데이터, 보유 다른 클래스가있는 경우 : 나는 수 없습니다를 원하는 경우

class Controller{ 
private: 
    Data *data; 

public: 
    inline std::vector<Point*> getPoints(){ 
    return data->getPoints(); 
    } 
} 

는 둘 다, const를 참조되어야한다 복사 했어?

+0

[접근자가 값 또는 상수 참조를 반환해야합니까?] (http://stackoverflow.com/questions/4613823/should-accessors-return-values-or-constant-references) – fredoverflow

답변

2

귀하의 방법은 points 사본을 만듭니다. 벡터 자체에 대한 수정은 클래스 내부의 points으로 전파되지 않습니다. 대신 복사를 피하기 위해 const 참조를 반환 할 수 있습니다. 호출자는 원할 경우 복사 할 수 있지만 제어 할 수는 있습니다.

벡터를 반환 할 때 만들어지는 복사본은 얕습니다. 이는 개별 점이 노출되었음을 의미합니다. 호출자가 점을 수정하면 (벡터를 수정하는 것과 반대)이 수정 사항은 클래스 내부의 벡터가 가리키는 점으로 전파됩니다.

Point의 내용을 보호하는 것은 훨씬 어렵습니다. 수동으로 복사해야합니다. 또한 발신자가 수동 해제를 요구합니다. 그러나 일반적으로 더 쉬운 자원 관리를 위해 스마트 포인터 (std::unique_ptr 또는 std::shared_ptr)를 사용하는 것이 좋습니다.

+0

포인트가 노출되어 있기 때문에 노출되었을 수 있습니다. 포인터? – tower120

+0

@ tower120 수정. 그들이 가치가 있었다면, 그들은 또한 복사 될 것입니다. – dasblinkenlight

+0

제발, 내 업데이트 된 질문을 봐. 내가 알고 있듯이 현재의 구현은 내 "포인트"를 두 번 복사합니다. – tower120

0

원본 벡터를 복사합니다.

그렇게하고 싶지 않으면 const 참조를 반환하십시오.