2011-05-03 11 views
1

QList를 사용하고 있지만 iterator를 사용하고 싶지만 auto 키워드를 사용하더라도 iterator는 실패합니다.QList :: iterator는 (오류) 0을 반환합니다.

for(auto iter = myModel->getList().begin(); iter != myModel->getList().end(); ++iter) 
{ 
    if((*iter)->getList().empty()) 
    { 
     if((*iter)->getData()->getCode() == baseData->getCode()) 
      return true; 
    } 
} 
return false; 

왜 이런 일이 일어날 수 있는지 알고 계십니까? 또는 QList :: iterator를 사용하는 다른 방법이 있습니까?

EIDT : 나는 이것에 관해 또 다른 이상한 점을 알아 차렸다. iterator가 (오류) 0을 보여주고있는 것을 볼 수 있는데, 실제로 필요한 데이터가 포함되어 있기 때문에 이것은 이상합니다.

그러나 나는 다음과 같이 내 코드를 편집하는 경우 :

QList<T*> tempList = myModel->getList();  
for(auto iter = tempList .begin(); iter != tempList .end(); ++iter) 
     { 
      if((*iter)->getList().empty()) 
      { 
       if((*iter)->getData()->getCode() == baseData->getCode()) 
        return true; 
      } 
     } 
     return false; 

후 모든 것이 잘 작동

. 나는 그것이 해결책이라고 생각하지만, 왜 이런 식으로해야 하는지를 아는 사람이 있습니까? 아니면 나는 뭔가 중요한 것을보고 있지 않습니까?

+0

정확하게 0을 반환 할 항목은 무엇입니까? 이러한 변수의 유형은 무엇입니까? myModel-> getList()가 원하는 것을 반환하는지 확인하십시오. –

+0

iter는 QList :: iterator이고 myModel-> getList()는 QList 을 반환하므로 begin()을 사용할 때 iterator를 myModel-> getList()에 제공해야합니다. 그리고 어느 쪽이든, getList()가 QList를 반환하는 한 자동 키워드를 사용하기 때문에 iter는 일부 목록의 반복자 여야합니다. – Keerigan

답변

2

코드에 2 가지 문제점이 있습니다.

QList<T*> YourModel::getList() 

실제로 액세스 위반을 얻어야한다 : 당신의 QList의 사본을 반환 myModel->getList()

a)이 같은 것을 선언했다. 그러나 그것이 일어난 일인지 나는 모른다.

b) Visual Studio에서 iter에 대해 말하는 것에 의존하는 경우 틀린 것을 잊어 버리십시오. iterator를 처리 할 수 ​​없다. 이터레이터가 it (오류) 0을 int로 말하면서 역 참조하면 올바른 데이터를 제공합니다.

위의 경우에 해당하지 않는 경우 실제로 잘못된 것이 무엇인지 명시하십시오. for 루프가 모두 건너 뛰었습니까? 그렇다면 그에 따라 답변을 수정하겠습니다.

안부
D는 임시 목록 객체와 잘 작동하는 이유는 다음입니다

편집 : 당신이 목록의 begin() 방법 반복자를 만드는 순간, 목록 분리의 개인 데이터 (암시 적 공유). 즉, 해당 반복자로 데이터를 변경할 수 있기 때문에 자체 복사본을 만듭니다. 임시 객체가 없으면 myModel->getList()은 반복자가 생성 된 직후에 임시 객체를 생성하여 파괴합니다. 그 순간부터 이터레이터는 아무데도 가리킨다. const iterator을 사용해 볼 수도 있습니다.이 경우 문제없이 개인 데이터를 분리하지 않고 작동해야합니다. 또 다른 접근법은 모델이 const 참조 또는 포인터로 목록을 반환하도록하는 것입니다. 또 다른 방법은 이터레이터를 버리고 목록의 at() 메서드를 직접 사용하는 것입니다.내 의견으로는 코드를 읽기 쉽게 만든다.

+0

나는 그 (오류) 0 것, 그리고 그것이 적절한 데이터를 포함하고있는 것으로 나타났습니다. 그러나 나는 이것에 대해서 또 다른 이상한 점을 발견했다. 편집하고 질문을 추가하여 보여 드릴 것입니다 – Keerigan

+0

답변을 업데이트했습니다. 잘하면 그것은 그것을 설명 할 것이다. –

+0

QList 때문에 복사 문제입니까? – Keerigan

1

myModel-> getList는 어떤 유형의 결과를 반환합니까? 당신이 목록의 목록을 가지고하지 않는 한

이 라인은 의심 같습니다

if((*iter)->getList().empty()) 

어쨌든, 통화 자체가 전반적으로 좋아 보인다. 유일한 실제 설명은 유형 또는 데이터 (또는 그 부족)에 따라 달라집니다. 게시 한 코드에 명확하고 분명한 문제가 없습니다.

+0

필자는 재귀를 수행 할 것입니다. 더 깊게 갈 수 있지만 더 이상 만들지 않습니다. iter는 for 루프에서 만들 때 0입니다. – Keerigan

+0

이 질문을 할 때 겸손 해지는 것을 의미하지는 않지만 myModel-> getList의 결과는 무엇입니까?).카운트()? – Arelius

+0

걱정하지 마라, 나는 5 등을 맞이한다 – Keerigan

관련 문제