2017-10-14 5 views
0

최근에 우리는 목록을 순회하는 STL 반복자에 관해 배웠습니다. 연결된리스트의 기본 반복자에 대한 예제 코드에서 나는 이해할 수없는 것을 발견했다.C++의 반복자 클래스 이해하기

우리는 2 개의 반복자 클래스, const_iterator와 iterator를 받았다. 이들은 모두 List 클래스의 하위 클래스였습니다. const_iterator에서 상속받은 iterator. 이터레이터의 생성자에서 왜 이렇게 작성되었는지는 잘 모르겠습니다.

반복자 클래스 :

class iterator:public const_iterator{ 
    friend sortedList 
protected: 
    iterator(Node* n):const_iterator(n){} 
public: 
    iterator(){ 
     n = nullptr; 
    } 

const_iterator를 클래스 : 반복자가 const_iterator를 상속 않는 이유는 반복자의 생성자가 const_iterator를 용의 ctor를 초기화하고 자체에 아무것도하지 않고 왜

class const_iterator { 
    friend SortedList 
protected: 
    Node* curr_; 
    const_iterator(Node* n){ 
     curr_ = n; 
    } 
public: 
    const_iterator(){ 
     curr_ = nullptr; 
    } 

내 질문입니다.

사이드 질문; iterator에서 curr_에 접근 할 때 어떻게 참조 할 것인가? 나는 curr_을 호출 할까 아니면 this-> curr_를 사용할 것인가? 반복자는 const_iterator를 상속 않는 이유는 반복자의 생성자가 const_iterator를 용의 ctor를 초기화하고 자체에 아무것도하지 않고 왜

+1

표준 라이브러리 코드가 아닙니다. 이를 이해하기 위해, 우리는 당신이 요구하는 모든 구현을 더 많이 볼 필요가 있습니다. –

+0

어쨌든'iterator'의 default-ctor가 깨졌습니다. – Deduplicator

+1

const_iterator에서 상속하는 이유를 이해하는 데 도움이되는 https://stackoverflow.com/questions/2844466/can-iterator-type-just-subclass-constiterator를 살펴볼 수 있습니다. 개인적으로 IMO 공개 상속은 여기에 해당하지 않는 '공개'정보 (즉, 모델이 다형성로 사용될 객체에 대한 관계)를 전달하는 데 사용되어야하기 때문에 개인적으로이 방식을 좋아하지 않습니다. –

답변

2

내 질문입니다.

iteratorconst_iterator로 변환되는 표준 컨테이너에 대한 요구 사항이 있습니다. 하나를 다른 것으로부터 파생시키는 것은 이것을 성취하는 한 가지 방법입니다.

const_iterator 기본 클래스 저장한다 Node하지만 iterator 포인터가 기본 클래스에게 파라미터를 전달하면 curr_ 부재 모두베이스를 초기화하고 사용할 수있는 유도하지 않는 것이다.

iterator에서 curr_에 액세스 할 때 어떻게 참조 할 수 있습니까? 나는 curr_을 호출 할까 아니면 this-> curr_를 사용할 것인가?

회원 변수인지 아닌지에 관해 질문이없는 한 curr_을 기본 클래스와 파생 클래스에서 모두 사용할 수 있습니다. 이름이 밑줄로 끝나는 것은 구성원 변수 이름에 대한 일반적인 규칙입니다.

범위가 의심스러운 경우 this->member을 사용하면 클래스 구성원을 참조하는 것이 분명해집니다.

사용 this-> 그것은 정말 (나 같은) 일부 사람들이 혼란 여분의 것으로 간주 필요하지 않습니다 그래서 이름을 명확하게하기 위해 실제 필요가 어디에 아마 경우에 저장해야합니다.