Post List

2015년 1월 4일 일요일

자원 관리 클레스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자.

* 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어 주어야 합니다.

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; } // 암시적 변환 함수




 명시적 변환을 제공할 것인지 암시적 변환을 허용할 것인지에 대한 결정은 해당 클래스만의 적절한 용도와 사용 환경에 따라 달라져야 한다. 하지만 맞게 쓰기에는 쉽게, 틀리게 쓰기에는 어렵게 만들어져야 한다.

댓글 없음:

댓글 쓰기