이것만은 잊지 말자

- 자원을 직접 접근하는 경우가 있기 때문에 RAII 클래스를 만들 때는 관리하는 자원을 얻을 수 있는 방법을 구현해야 함

- 자원 접근은 명시적 변환, 암시적 변환을 통해 가능, 안전성만 따지면 명시적 변환이 대체적으로 더 나음

RAII 객체에서 자원을 변환할 방법

명시적 변환

스마트 포인터의 get 함수 : 실제 포인터의 사본을 얻음

스마트 포인터의 operator->, operator*

 

암시적 변환

명시적 변환 함수를 호출하지 않아도 되므로 편리하지만 실수 발생할 가능성이 높음

f를 의도하지 않게 f2도 공유하여 한쪽에서 소멸시킬 경우 다른 한 쪽에서는 소멸된 객체를 가리킬 수 있는 위험이 있음

class FontHandle;
void changeFontSize(FontHandle f);

class Font
{
public:
	operator FontHandle () const { return f; } // 암시적 변환 함수
    
private:
	FontHandle f; // 실제 폰트 자원
};

Font f(getFont());
changeFontSize(f); // Font->FontHandle로 암시적 변환 수행

FontHandle f2 = f; // Font 객체를 복사하려고 했는데 f가 FontHandle로 변경되고 복사됨

 

따라서 암시적 변환보다는 명시적 변환을 제공하는 것이 바람직함

+ Recent posts

목차