2017-11-15 18 views
0

목록 클래스에 대한 반복기를 만듭니다. 반복자는 참조 연산자가 있습니다역 참조는 ptr-> operator *()에서는 작동하지만 * ptr에서는 작동하지 않습니다.

T& operator*() const { 
     return this->currentNode->data; 
    } 

반복자 사용하려고 시도하는 동안 :

for(; list->begin() != list->end; (*list_iter).operator++()) 
{ 
    cout << list_iter << endl; 
    cout << list_iter->operator*() << endl; 
    //cout << *list_iter << endl; //not working 
} 

주석으로 라인 "이진 experssion의 ostream에와 myList에 :: 반복자에 유효하지 않은 피연산자"라고합니다. 마찬가지로 (* list_iter) .operator ++()에서 list_iter ++ 또는 (* list_iter) ++로 변경하면 비슷한 오류가 발생합니다. 나는 무슨 일이 일어나고 무슨 생각

이 같은 것입니다 :

int num1 = 3; 
int *num2 = new int; 
*num2 = 3; 

이 경우, NUM1는 == * NUM2 ... * NUM2은 비록 NUM2은 (모두 정수) NUM1 기능적으로 유사하다 정수에 대한 포인터 인 * num2는 정수로 만듭니다.

그래서에서 :이 경우

MyList list1(); 
MyList *list2 = new MyList(); 

, 나는 기대한다 "*리스트 2" "*의 NUM2는"NUM1과 유사 것과 같은 방식으로 목록 1과 유사하게? num2가 dereferencer를 호출하거나 MyList을 MyList로 변환하려고합니까?

여기에서 무슨 일이 벌어지고 있는지 정말 고민하고 있습니다. 감사!

+1

I을 작고 완전한 코드 예제를 포함해야한다고 생각합니다. 게시 한 글에서 무엇이 잘못되었는지 명확하지 않습니다. – Eljay

답변

0

루프가 완전히 잘못되었습니다.

반복자가 list_iter에 저장되지 않고 있습니다.이 반복자는 end() 반복자와 직접 비교됩니다. 목록이 비어 있지 않으면 루프가 영원히 돌아갑니다.

(*list_iter).operator++()은 해당 데이터에 액세스하기 위해 반복기를 참조 취소 한 다음 해당 데이터에서 반복기 자체가 아니라 operator++을 호출합니다.

cout << list_iter 이터레이터에는 정의되지 않았습니다. 참조되는 데이터를 출력 할 수 있도록 이터레이터를 참조 해제해야합니다 (cout << *list_iter).

cout << list_iter->operator*()은 해당 데이터에 액세스하기 위해 반복기를 참조 취소 한 다음 해당 데이터에서 반복기 자체가 아닌 operator*을 호출합니다.

for(list_iter = list->begin(); list_iter != list->end(); ++list_iter) 
{ 
    cout << *list_iter << endl; 
} 

를 또는 C++ 11에, 당신은 대신 range-for loop를 사용하고 당신을 위해 반복자 처리하도록 할 수 있습니다 :

귀하의 루프는 더이 대신 같아야합니다

for(auto &data : *list) 
{ 
    cout << data << endl; 
} 
1

오버로드 된 operator*은 정의한 클래스의 개체에서 직접 사용하는 경우에만 적용됩니다. 이러한 객체에 대한 포인터에는 영향을 미치지 않습니다. 포인터에 *을 사용하면 기본 객체로 간접 참조됩니다. 추가 *은 오버로드 된 operator*을 호출합니다. 귀하의 케이스 ptr->operator*() 작품에서

MyIterator *iter = new MyIterator(); 
*iter; // This will only dereference the pointer. 
**iter; // This will dereference the pointer and call your operator*. 

-> 이미 첫 번째 역 참조를 수행하기 때문이다. (*ptr).operator*()과 같습니다.

이터레이터는 일반적으로 by-value로 사용되므로 포인터 뒤에서 찾을 필요가 거의 없습니다.