이것만은 잊지 말자
- 자원을 직접 접근하는 경우가 있기 때문에 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로 변경되고 복사됨
따라서 암시적 변환보다는 명시적 변환을 제공하는 것이 바람직함
'C++ > Effective C++' 카테고리의 다른 글
Effective C++ 항목 17 new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 (0) | 2024.07.10 |
---|---|
Effective C++ 항목 16 new 및 delete를 사용할 때는 형태를 반드시 맞추자 (0) | 2024.07.09 |
Effective C++ 항목 14 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 (0) | 2024.07.05 |
Effective C++ 항목 13 자원 관리에는 객체가 그만! (0) | 2024.07.03 |
Effective C++ 항목 12 객체의 모든 부분을 빠짐없이 복사하자 (0) | 2024.07.03 |