2010-04-12 2 views
2

함수에 전달할 매개 변수의 긴 목록을 보유 할 클래스를 만들려고합니다. 이 짧은 예제를 사용 해보겠습니다.C++ 개인 포인터 "유출"?

class ParamList{ 

public: 
    ParamList(string& a_string); 
    string& getString(); //returns my_string 
private: 
    string& my_string; 
} 

내 질문은 : my_string은 비공개이지만 아직 그것에 대한 참조를 반환합니다. C++에서 개인 포인터가 누출되는 것과 같은 것이 아닌가요? 이것은 좋은 프로그래밍 습관이 아닌가? getString의 호출자가 참조를 가져 와서 수정할 수있게하려고합니다.

알려 주시기 바랍니다.

감사합니다, jbu

EDIT1 : 발신자에는 getString을 (사용) 및 반환 된 문자열을 수정할 수 있습니다.

+3

당신이하고있는 일을 정확하게 알지 못한다면 회원으로 언급하는 것은 모호한 습관입니다. 그러나이 코드에는 어떤 포인터도 보이지 않습니다. –

+0

확인. 내가 뭘하는지 모르겠다. my_string이 포인터이고 getString이 문자열에 대한 포인터를 반환하면 어떨까요? – jbu

+0

여전히'const string * '을 반환해야합니다. – David

답변

2

먼저 ParamList가 문자열을 소유할지 아니면 "알고 있는지"를 결정해야합니다. string& my_string으로 작성한 방식은 누군가 다른 사람의 문자열에 손잡이가 있다는 것을 의미합니다. 이 경우, ParamList가 처음부터 그 문자열을 소유하고 있지 않기 때문에 문자열을 수정하는 것이 (많은 부분에서) 문제가되지 않습니다! 이 설정 사용하는 것이 아마 더 나은 것을

class ParamList{ 

public: 
    ParamList(const string& a_string); // do a strcpy in here. 

    const string& getString(); //returns my_string 
    void setString(const string& new_string); //do a strcpy here too. 
private: 
    string my_string; 
} 

참고 :

당신이 ParamList이 매개 변수의 전체 마스터 복사본을 갖고 싶어

은 같은 것을 할, (당신이 해결하려는 문제에 따라 다름) 어쨌든 const가 아닌 참조를 반환하는 대신 함수를 가져 오면 ParamList는 멤버의 수정 방법을 조금 더 제어 할 수 있습니다. 개인 참조를 Returing

+4

"Do a strcpy"??? –

+0

@Neil : "한 문자열에서 다른 문자열로 복사"의 약자. – David

+3

표준 라이브러리의 함수 이름 - 혼동 가능성 : 높음. –

3

같이 너무 오래 완벽하게 괜찮하십시오 const 참조입니다

A., 그 참조가 무효 또는 기준을 수정하기위한 것입니다 그건
B. 할 수있을 때 당신은 문서화 (ie std::vector<T>::operator[])

비 const 참조를 반환하는 유용한 사례가 있지만 일반적으로 피해야합니다. Scott Meyers' Effective C++ (제 3 판, 항목 28)에 설명되어 있습니다. 한 번 보려는 경우 내부 개체에 "핸들"을 반환하지 마십시오.