자원 관리 클래스에서 관리되는 자원은 외부에서 접근가능하도록 하자
이코드를 보자.
std::tr1::shared_ptr<Investment> pInv(createInvestment());
…
//그리고 이함수를 사용한다고 가정해보자.
int daysHeld(const Investment *pi);
//만약 위 함수를 아래코드와 같이사용한다면 에러!
int days = daysHeld(pInv); //ERROR!
에러 사유) daysHeld는 Investment*의 실제포인터를 원하기 때문이다.
결론) RAII의 객체안에 실제자원을 변활해줄 방법이 필요
1. 명시적변환
(1) int days = daysHeld(pInv.get()); //실제포인터를 반환해준다 get함수를 이용해서
2. 암시적변환
(1) 포인터 역참조 연산자(operator-> / operator*)를 오버로딩하여 암시적변환을 수행한다.
즉, 외부에서 자원 접근을 가능하게 한다.
위 명시적변환에서 포인터를 얻고싶을때, get()을 호출해줘야하기 때문에 안이뻐보일 수 있다.
따라서 연산자 오버로딩을 통해
daysHeld(pInv) 그대로 사용가능할 수 도 있다.
하지만, 이와 같은 연산자 오버로딩으로 인해 부작용이 생길가능성이 있다.
이것만은 알아두자!
1. RAII 클래스를 만들때에는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어줘야 한다.
2. 자원 접근은 명시적 변환 혹인 암시적으로 가능하다. 안전성(명시적 > 암시적), 고객편의성(명시적 < 암시적)
'책 정리 > Effective C++ 3rd' 카테고리의 다른 글
항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 (0) | 2020.01.02 |
---|---|
항목 16. new 및 delete 를 사용할 때는 형태를 반드시 맞추자 (0) | 2020.01.02 |
항목 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 (0) | 2019.12.30 |
항목 13. 자원 관리에는 객체가 그만! (0) | 2019.12.19 |
항목 12. 객체의 모든 부분을 빠짐없이 복사하자 (0) | 2019.12.18 |
댓글