• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

vector 직접 구현 관련

21.01.26 18:11 작성 조회수 345

1

안녕하세요! 정말 좋은 강의 잘 듣고 있습니다^^

1. 혼자서 구현을 해 보다가, reserve(.)에서 기존 capacity보다 신규 capacity가 작게 잘못 넣은 경우 size_까지 복사할 때 없는 배열에 접근하게 되는 문제가 되는 것 아닌가 생각이 듭니다. 그래서 다음과 같이 조기 종료 코드를 넣으면 어떤가요?

       if (new_capacity < capacity_)
        {
            cout << "please make it bigger, not smaller ";
            return;
        }

2. 그리고 Iterator 생성자를 pointer에 대한 reference로 두는 경우(다음 코드)에는 에러가 이렇게 나는데 ㅠㅠ 혹시 이유가 무엇일까요?

Iterator(const T*& ptr) : _ptr(ptr)
{}

//ERROR
1>C:\Developer\CppForGameDeveloping\CPP_Basics\VectorMyself\VectorMyself.cpp(129,1): error C2440: '<function-style-cast>': cannot convert from 'T *' to 'Iterator<T>'

미리 감사합니다!!

답변 3

·

답변을 작성해보세요.

1

우연히 지나가다가 추가 질문을 봤는데,
글을 수정하시면 저한테 알림이 안 와서 알 수가 없습니다. ㅎㅎ
다음에는 댓글로 남기시거나 새로운 질문을 해주시기 바랍니다.

우선 참조값은 둘째치고 const T* 타입을 _ptr(ptr)을 통해 T* 타입으로 만들려고 하니,
여기서 첫번재 문제가 일어납니다.
굳이(?) 그렇게 받으시겠다면 캐스팅이 필요합니다.

문제는 거기서 끝나는게 아니라
const T*&를 인자로 받아야 하는데, const 참조는 왼값을 인자로 받으며

기본 코드에서 &_data[0]는 오른값이라 넣어줄 수 없습니다.


역시나 굳~이 꿋꿋하게 하려면 이렇게 한 단계를 거쳐서
왼값으로 만들어서 넣어줘야 합니다.

만약 위와 같은 문제가 해결되지 않으면,
Iterator(const T*& ptr)은 알맞는 후보가 아니라고 판단하기에
다른 생성자를 찾아보는데 나머지 애들도 맞는게 하나도 없으니

cannot convert from 'T *' to 'Iterator<T>'

자포자기 하고 에러가 뜨는 겁니다.

왼값 오른값에 관해서는 Modern C++쪽 후반부 내용을 참고하시기 바랍니다.

0

답변을 읽고 곰곰 생각을 해 보니  const T* 타입을 T* 타입으로 만드는 게 원칙적으로 안 된다는 것을 제대로 몰랐던 것 같습니다. 

왼값 오른값도 엄청 좋은 복습이 되었습니다! 진심으로 감사드립니다. :)

실제 벡터는 예외코드가 아니라,  if (new_capacity > capacity_)인 경우에만 동작하게 되어 있네요!  

0

예외 코드는 넣는다고 절대 손해볼 것은 없으니,
당연히 바람직한 방법입니다.

실제 표준 vector에서도 예외처리를 하는지 살펴보면 좋을 것 같네요.