class Invest { ... }; int daysHeld(const Invest *pi) { ... }; std::tr1::shared_ptr<Invest> pInv(new Invest()); int days = daysHeld(pInv); // 오류 : pInv는 Invest* 가 아니라 shared_ptr<Invest> int days = daysHeld(pInv.get()); // OK : 실제 포인터에 접근
자원에 접근하게 열어주는 것은 캡슐화에 위배되는 것이지 않나 ? RAII 클래스의 목적은 데이터 은닉이 아니다. 자원 해제가 그 목적이다.
* 자원 접근은 몇시적 변환 혹은 암시적 변환을 통해 가능합니다. 안전성만 따지면 명시적 변환이 대체적으로 더 낫지만, 고객 편의성을 놓고 보면 암시적 변환이 괜찮습니다.
T get() const { return f; } // 명시적 변환 함수 operator T() const { return f; } // 암시적 변환 함수
명시적 변환을 제공할 것인지 암시적 변환을 허용할 것인지에 대한 결정은 해당 클래스만의 적절한 용도와 사용 환경에 따라 달라져야 한다. 하지만 맞게 쓰기에는 쉽게, 틀리게 쓰기에는 어렵게 만들어져야 한다.
댓글 없음:
댓글 쓰기