이번 항목의 주요 포인트
- 사용자정의 스마트포인터로 포인터의 암시적 변환을 따라해보자
- 스마트포인터의 암시적 변환 설계를 알아보자
- 멤버 함수 템플릿을 사용해보자
1. 사용자정의 스마트포인터
using namespace std;
class CBase
{ };
class CDerived : public CBase
{ };
template<typename T>
class SmartPtr
{
public:
explicit SmartPtr(T* ptr)
{ }
};
int main()
{
SmartPtr<CBase> ptBase = SmartPtr<CBase>(new CBase);
SmartPtr<CBase> ptDerived = SmartPtr<CDerived>(new CDerived);
}
2. 복사생성자
using namespace std;
class CBase
{ };
class CDerived : public CBase
{ };
class CDerived2 : public CBase
{ };
template<typename T>
class SmartPtr
{
public:
explicit SmartPtr(T* ptr)
{ }
SmartPtr(const SmartPtr<CDerived>& rhs)
{ }
};
int main()
{
SmartPtr<CBase> ptBase = SmartPtr<CBase>(new CBase);
SmartPtr<CBase> ptDerived = SmartPtr<CDerived>(new CDerived);
SmartPtr<CBase> ptDerived2 = SmartPtr<CDerived2>(new CDerived2);
}
3. 일반화 복사생성자
using namespace std;
class CBase
{ };
class CDerived : public CBase
{ };
class CDerived2 : public CBase
{ };
class COther
{ };
template<typename T>
class SmartPtr
{
public:
explicit SmartPtr(T* ptr)
{ }
template<typename U>
SmartPtr(const SmartPtr<U>& rhs)
{ }
};
int main()
{
SmartPtr<CBase> ptBase = SmartPtr<CBase>(new CBase);
SmartPtr<CBase> ptDerived = SmartPtr<CDerived>(new CDerived);
SmartPtr<CBase> ptDerived2 = SmartPtr<CDerived2>(new CDerived2);
SmartPtr<CBase> ptOther = SmartPtr<COther>(new COther);
}
4. 일반화 복사생성자의 자유도 제한
using namespace std;
class CBase
{ };
class CDerived : public CBase
{ };
class CDerived2 : public CBase
{ };
class COther
{ };
template<typename T>
class SmartPtr
{
public:
explicit SmartPtr(T* ptr)
: realPtr(ptr)
{ }
template<typename U>
SmartPtr(const SmartPtr<U>& rhs)
: realPtr(rhs.getPtr())
{ }
T* getPtr() const
{
return realPtr;
}
private:
T* realPtr = nullptr;
};
int main()
{
SmartPtr<CBase> ptBase = SmartPtr<CBase>(new CBase);
SmartPtr<CBase> ptDerived = SmartPtr<CDerived>(new CDerived);
SmartPtr<CBase> ptDerived2 = SmartPtr<CDerived2>(new CDerived2);
SmartPtr<CBase> ptOther = SmartPtr<COther>(new COther);
}