[Effective C++] #15 자원 관리 객체, 자원에 대한 접근
Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 3장 "자원 관리", 항목 15 "자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자"에 해당하는 내용입니다.
자원 관리 객체, 그리고 자원에 대한 접근
자원 관리 객체는 외부(API)에서 해당 자원을 접근할 수 있도록 허용해야 합니다. 물론, 외부의 접근을 허용하는 행동은 캡슐화에 위배되는 행동입니다. 하지만, 자원 관리 객체의 목적은 자원을 외부로부터 숨기기 위함이 아니라, 성공적으로 자원 해제를 수행하기 위 위함입니다. 자원 관리 객체의 자원들에 접근하는 방법은 두 가지가 있습니다. 하나는 "명시적 변환", 그리고 다른 하나는 "암시적 변환"이 있습니다. 하나씩 살펴보겠습니다.
명시적 변환, get()
std::tr1::shared_ptr <A_클래스> pA; // shared_ptr 타입의 객체
int daysHeld (const A_클래스* pA); //A_클래스의 포인터를 인자로 받습니다.
int days = daysHeld (pA.get()); // get을 통해 shared_ptr -> A_클래스*
std::tr1::shared_ptr과 std::auto_ptr은 명시적 변환을 수행하는 get 멤버 함수를 제공합니다. 이 함수는 자원 관리 객체의 실제 포인터를 반환합니다. 예를 들면, "std::tr1::shared_ptr <A_클래스> pA (createAClass());"의 경우 "A_클래스*"를 반환하겠죠.
암시적 변환
class 자원관리_클래스 {
public:
explicit 자원관리_클래스 (실제자원 A)
: a(A)
{}
~자원관리_클래스 () {release(a);}
실제자원 get () const { return a; } // 직접 정의한 명시적 변환 함수
or
opeartor 실제자원() const { return a; } // 직접 정의한 암시적 변환 함수
private:
실제자원 a;
};
암시적 변환을 사용할 것인지, 명시적 변환을 사용할 것인지, 자원관리 클래스의 용도와 사용 환경에 따라 결정해야 합니다.
'언어 > Effective C++' 카테고리의 다른 글
[Effective C++] #17 자원 관리 객체와 new 사용 (0) | 2022.01.17 |
---|---|
[Effective C++] #16 new 및 delete 사용 (0) | 2022.01.17 |
[Effective C++] #14 자원 관리 객체 심화, RAII, shared_ptr, 삭제자 지정 (0) | 2022.01.14 |
[Effective C++] #13 자원 관리 객체, std::auto_ptr, std::shared_ptr (0) | 2022.01.14 |
[Effective C++] #11 중복 참조와 자기 대입 연산자 (0) | 2022.01.12 |