• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

15.3 이동 생성자와 이동 대입에서 타입에 대해 질문드립니다.

20.08.18 23:41 작성 조회수 77

0

// AutoPtr.h
template<class T>
class AutoPtr
{
private:
    T * m_ptr;

public:
    AutoPtr(T* ptr = nullptr)
        :m_ptr(ptr)
    {
        std::cout << "AutoPtr default constructor" << std::endl;
   }
///////////////////////////////////////////////////////////////////////
// Resource.h
class Resource
{
//private:
public:
    int *m_data = nullptr;
    unsigned m_length = 0;
public:
    Resource()
    {
        std::cout << "Resource default constructed" << std::endl;
    }
    Resource(unsigned length)
    {
        std::cout << "Resource length constructed" << std::endl;
        this->m_data = new int[length];
        this->m_length = length;
   }
///////////////////////////////////////////////////////////////////////

AutoPtr<Resource> res(new Resource(10000000));    <------main.cpp에 있는 코드

이 부분에서 어떻게 양변의 타입이 같은 것인지 이해가 가지 않습니다.

먼저 둘다 typeid().name() 을 해보니 7AutoPtrI8ResourceE 라고 나오니 타입이 같습니다.

그런데 제 머릿속으로 동적 할당을 이해하기로는

int *p(new int(10)); 같이

좌변 = 동적할당을 할 메모리의 주소를 저장할 '포인터' p

그 사이에 new

우변 = 동적할당을 할 메모리의 자료형(argument)

이렇게 이해하고 있습니다.

그런데 저는 AutoPtr<Resource> res(new Resource(10000000)); 는

좌변 = Resource형의 포인터 변수를  내부에 가지고 있는 클래스 AutoPtr 형 변수 res

그 사이에 new

우변 = int형 크기만큼 일렬로 10000000번 동적 할당한 메모리의 첫번째 주소를 가리키는 포인터 변수를 내부에 가지고 있는 클래스 Resource

라고 이해가 되는데요.

여기서 Resource를 하나의 자료형이라 보면 우변은 이해가 됩니다.

그런데 좌변은 '포인터' 가 아니라 '클래스' 라고 생각이 되어지는데 '포인터' 가 자리에 와야 한다고 생각이 들어서 어떻게 클래스가 들어와도 프로그램이 잘 작동이 되는지 이해가 가질 않습니다. 어떻게 이해하면 될까요?

답변 1

답변을 작성해보세요.

0

Hello Yeo님의 프로필

Hello Yeo

2020.08.19

안녕하세요? 이 부분은 직접 확인하려고 시도하셨던 main 함수도 같이 올려주셔야 할 것 같네요.
일단 제가 드릴 수 있는 답변은...
만드신 코드에 따르면 AutoPtr<Resource> res(new Resource(10000000)); 는10,000,000 개의 resource를 생성하여 AutoPtr 안의 m_ptr이 그것을 가리키게 하는 구조입니다.
구현하신 코드 내에서 아래의 부분이 무슨 역할을 하는 것일까.. 고민해보시면 좋을 것 같습니다.

public:

    AutoPtr(T* ptr = nullptr)

        :m_ptr(ptr)

    {

        std::cout << "AutoPtr default constructor" << std::endl;

   }