2015. 8. 20. 09:49ㆍ프로그래밍/Effective C++
형변환을 통한 외부 접근
타입 불일치
- 실수 없이 자원을 관리하기 위해서는 스마트 포인터를 활용하는 방법이 소개되었다.
- 그러나 API 함수를 비롯한 표준 함수들은 원시 포인터(native pointer)를 원한다.
원시 포인터, 스마트 포인터
- 원시 포인터
int* pa;
- 스마트 포인터
std::tr1::shared_ptr<int> ps;
형변환 필요성
- 스마트 포인터는 해당 타입을 감싸고 있는 하나의 객체로 원시 포인터와는 엄연히 다른 타입이다.
- 원시 포인터를 필요로 하는 함수가 있을 경우 이를 형변환해주어야 컴파일 에러를 피할 수 있다.
스마트 포인터
get 함수
- 해당 타입의 원시 포인터 사본을 반환하는 멤버 함수이다.
- auto_ptr과 shared_ptr 모두 사용 가능하다.
- 반환값 : 해당 타입의 원시 포인터
- 시그니쳐 : void
operator->
- 오버로딩을 통해 원시 포인터의 -> 연산자와 같은 기능을 수행한다.
oprator*
- 오버로딩을 통해 원시 포인터의 * 연산자와 같은 기능을 수행한다.
명시적 변환
암시적 변환
매번 get() 함수를 통해 접근하는 것이 번거롭다면 암시적 변환이 가능한 자원 관리 클래스를 만들 수도 있다.
나는 명시적으로 호출 하겠다!
정리
- 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에,
RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어주어야 한다.
- 자원 접근은 명시전 변환 혹은 암시적 변환을 통해 가능하다. 안정성을 따지면 명시적 변환이 대체적으로 더 낫지만,
고객 편의성을 놓고 보면 암시적 변환이 괜찮다.
'프로그래밍 > Effective C++' 카테고리의 다른 글
인터페이스 설계방법. 제대로는 쉽게, 엉터리론 어렵게(effective c++ 18) (0) | 2015.08.20 |
---|---|
new로 생성한 객체를 스마트포인터에 저장하는 코드는 별도의 한 문장(effective c++ 17) (0) | 2015.08.20 |
new/delete 형태 맞추기(effective c++ 16) (0) | 2015.08.20 |
자원관리 클래스의 복사 동작에 대해(effective c++ 14) (0) | 2015.08.12 |
템플릿으로 만들어진 기본 클래스 접근하기(effective c++ 43) (0) | 2015.08.07 |
자원 관리는 객체가 그만(effective c++ 13) (0) | 2015.08.07 |
자기대입 처리(effective c++ 11) (0) | 2015.08.07 |