내부에서 사용하는 객체에 대한 핸들을
반환하는 코드는 되도록 피하자.
사각형의 좌측 상단, 우측 하단의 꼭짓점을
추상화한 Rec 클래스가 있다. 꼭짓점을
Rec클래스에 넣지 않고 별도의 구조체에
넣은 후 Rec가 이 구조체를 가리키도록 만들었다.
class point{
int x,y;
...
};
struct RecData{
point ulhc;
point lrhc;
};
class Rec{
tr1::shared_ptr<RecData> pData;
...
};
Rec 클래스의 사용자는 꼭짓점의 정보를
얻을 수 있어야하므로 멤버함수를 정의한다.
class Rec{
public:
point& upper() const (return pData->ulhc;}
point& lower() const (return pData->lrhc;}
}
함수들이 모두 const로 선언되어 있으나
함수안에서 리턴되는 참조자에 의해
값이 변경될 수 있다. ulhc, lrhc는 Rec의
멤버가 아니기 때문에 충분히 가능하다.
1. 클래스 데이터 멤버는 아무리 숨겨봤자 그 멤버의
참조자를 반환하는 함수들의 최대 접근도에 따라
캡슐화 정도가 정해진다.
2. 어떤 객체에서 호출한 상수 멤버 함수의 참조자
반환 값의 실제 데이터가 그 객체의 바깥에 저장되어 있다면
이 함수의 호출부에서 그 데이터의 수정이 가능하다.
참조자 뿐만 아니라 포인터, 반복자는 모두 핸들이다.
외부 공개가 차단된 멤버 변수 뿐만 아니라 멤버 함수에
대해서도 이들의 핸들을 반환하는 멤버 함수를 만들지 않아야 한다.
const point& upper() const (return pData->ulhc;}
const point& lower() const (return pData->lrhc;}
위의 문제는 이와 같이 const를 붙여주면 해결된다.
무효참조 핸들
객체를 참조자로 반환 했을 때
그 객체가 함수 내에서 선언된
지역 객체라면 함수가 종료됨과 동시에
없어지게 된다. 따라서 반환값을 받는
변수는 없어진 객체를 받게 된다.
핸들을 반환하는 것은 const를 붙였다해도
바깥으로 떨어져 나간 핸들은 그 핸들이 참조하는
객체보다 오래 살 위험이 있다. 따라서 핸들을
리턴하는 것은 되도록이면 피하도록 하자.
POINT!!
어떤 객체의 내부요소에 대한 해들을 반환하는 것은 되도록 피하자.
'C++ 심화' 카테고리의 다른 글
[C++] 인터페이스 상속과 구현 상속의 차이(2) (0) | 2017.02.20 |
---|---|
[C++] 인터페이스 상속과 구현 상속의 차이(1) (0) | 2017.02.20 |
[C++] 변수의 정의는 최대한 늦추자. (0) | 2017.01.05 |
[C++] 멤버 함수 보다는 비멤버 비프렌드 함수 (0) | 2017.01.02 |
[C++] 데이터 멤버의 선언 (0) | 2016.12.29 |