vector 구현해보기! (5)
카테고리: CppStudy
vector의 iterator 구현해보자!! (5)
* operator
iterator 는 포인터 라고 했다.
이 iterator 의 값을 확인하려면 *iterator 라고 작성하여야 한다.
* 연산자를 사용하기 위해 * operator 를 구현해보자.
코드
1
2
3
4
5
6
// iterator 클래스 내부
public:
T& operator* ()
{
return m_pData[m_iIdx];
}
이렇게 추가해주면
다음과 같이 오류가 뜨지 않게 된다.
하지만 아직 값은 확인할 수 없다. iterator 가 어떤 주소값을 가리키는지 알 수 없기 때문이다.
begin()
이제 vector 에 begin() 함수를 추가할 것이다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// CArr 클래스 내부
public:
// iterator 클래스 밑부분에 선언하거나 iterator 클래스를 전방선언 해주어야 한다.
// 반환형이 iterator 이기 때문이다.
iterator begin();
// iterator 클래스 내부
public:
iterator(T* _pData, int _iIdx)
: m_pData(_pData), m_iIdx(_iIdx)
{ }
// CArr 클래스 외부
template<typename T>
typename CArr<T>::iterator CArr<T>::begin() // inner class
{
if(m_iCount == 0)
return iterator(m_pData, -1);
return iterator(m_pData, 0);
}
중요한 것은 begin() 함수는 iteraotr, 즉 inner class 를 반환하는 형태라는 것이다.
이럴 때는 함수 앞에 typename 이라는 타입에 대한 정보를 알려주어야 한다.
그리고 begin() 함수를 참조형으로 반환해서 원본을 알려주어야 한다고 생각할 수 있다.
하지만 원본 이라고 부를 데이터가 없다.
참조형으로 반환을 하려면 지역변수로 iterator iter(m_pData, 0); return iter;
와 같이 해야하지만
iter 는 함수가 끝나면 사라져버릴 지역변수 이므로 이를 참조하는 것은 상당히 위험하다.
그렇기에 반환형은 iterator 로 한다.
동작시켜보자.
댓글남기기