ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective C++...26
    일지 2022. 7. 18. 08:59

    내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자

    함수의 반환형에 의해 캡슐화 변동

    기본적으로 멤버 변수를 private으로 선언했다고 하더라도 public함수가 해당 멤버 변수를 참조형 또는 포인터로 반환한다면 이 멤버 변수는 public으로 봐야 한다.

     

    즉, 객체의 내부 요소는 함수의 핸들 반환 시에도 캡슐화의 정도가 달라지게 된다.

     

    다음과 같이 사각형을 나타내는 클래스가 있을 때 사용자가 사각형의 정보를 볼 수 있게 하기 위해 참조형을 반환한다면 반환된 값을 통해 수정될 수 있는 위험이 있다.


    struct RectData {

        Point ulhc;

        Point lrhc;

    };

    class Rectangle {

        ...

    private:

        std::tr1::shared_ptr<RectData> pData;

    public:

        Point& upperLeft() const { return pData->ulhc; }

        Point& lowerRight() const { return pData->lrhc; }

    };


    ※ 어떤 값을 읽기 전용으로 반환하고 싶으면 const를 붙이는 것을 잊지 말자.

     

    핸들 반환 시 무효 참조 핸들이 되는 문제

    반환된 핸들을 사용하려고 할 때 해당 핸들의 원본이 제거되어 있을 수 있다.

     

    이 것은 const를 붙이든 붙이지 않든 동일하게 발생하는데, 반환된 핸들을 저장해 두고 사용하기 전에 객체 내부에서 해당 핸들이 참조하는 값이 제거되었을 때 외부에서는 손 쓸 방법이 없다.

     

    따라서 핸들을 외부로 반환하는 것은 굉장히 조심스럽게 접근해야 한다.

     

    댓글

Designed by Tistory.