책 정리/Effective C++ 3rd

항목 15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근하도록 하자.

ocean20 2019. 12. 30. 14:10

자원 관리 클래스에서 관리되는 자원은 외부에서 접근가능하도록 하자

 

이코드를 보자.

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. 자원 접근은 명시적 변환 혹인 암시적으로 가능하다. 안전성(명시적 > 암시적), 고객편의성(명시적 < 암시적)