내부에서 사용하는 객체에 대한 핸들을

반환하는 코드는 되도록 피하자.


사각형의 좌측 상단, 우측 하단의 꼭짓점을

추상화한 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!!

어떤 객체의 내부요소에 대한 해들을 반환하는 것은 되도록 피하자.

+ Recent posts