2013-06-05 2 views
0

처음으로 첨자 연산자를 오버로드하고 참조 값을 반환하는 데 문제가 있습니다.
나는 C++ faq 태그의 게시물에서 엄지 손가락 법칙을 따랐지만 빠진 것이 있습니다. (즉, 두 const 키워드를 제외하고는 동일하다) const 리턴 값 const 기능 (상기와 같이)으로하고,없는 :아래 첨자 연산자 오버로딩 : 참조 문제 반환

const T& operator[](int index) const { 
    if ((index < 0) || (index > size)) { 
        // provide exception handling for this error 
     std::cout << "Error! Index out of bound." << std::endl; 
     std::exit(0); 
    } else { 
     Block* b = head; 
     while (b) { 
      if (b->position == index) 
       return *b->data; 

      b = b->next; 
     } 
    } 
} 

I 두 변종들을 구현.
문제는 테스트 메인을 실행할 때 충돌이 발생한다는 것입니다. 나는 그 버그가 return *b->data; 진술에 있다고 생각했지만, 그것이 틀릴 수도 있고 다른 오류가있을 수도 있다고 생각하지도 못한다.
아이디어가 있으십니까?
미리 감사드립니다.

+3

먼저 실수'(인덱스> 사이즈) '(또는보다 "시각적"'(크기 <= 인덱스) ') (인덱스> = 사이즈)'되어야 왜냐하면'index'의 유효 범위는'[0, size-1]'(즉'[0, size]')라고 생각하기 때문입니다. 둘째로, 실행이'(b-> position == index)'조건을 결코 만족시키지 않고'b'가 null이 될 때 루프를 빠져 나가면 어떻게 될까? 함수에 의해 반환되는 것은 없으며 정의되지 않은 동작이므로 오류 케이스도 처리해야합니다. –

+0

@ gx_ 반환 값이없는 경우를 처리 할 제안이 있습니까? 나는 이미 오류를 고려했지만 나중에 수정할 수 있도록 기록을 남겼다. – Overflowh

+1

코드의 내부 구조를 알지 못합니다. 논리적으로는 결코 일어나지 않아야합니다. (즉, 각각의 유효한'index'에 대해'블록'에'equal'이 존재한다고 가정한다면) linked-list) 'while'본문 뒤에 (또는 함수 본문의 끝 바로 앞에) 어설 션을 넣거나 (위와 같이 오류를 출력하고 종료 할 수 있습니다) 가정합니다. 그렇게하고 나면 첫 번째 의견의 수정 사항을 적용한 후에도 프로그램이 여전히 중단됩니까? 그리고/또는 어떤 에러 메시지를 출력합니까? –

답변

1

데이터에 대한 참조를 반환하려면 원하는 형식인지 T 유형의 참조를 반환하고 데이터 형식이 T라고 가정 할 때 확실하지 않습니다. 다음과 같은 형식이어야합니다.

return b->data; 

그렇지 않으면 데이터 주소에 대한 참조가 반환됩니다.

EDIT : 수정

+0

당신이 말하는 것은 링크와 모순됩니다. '->'는'*'보다 우선 순위가 높습니다. – juanchopanza

+0

oww, 죄송합니다. 내 잘못입니다. – Nic007

+0

반환에서'*'를 제거하면이 '오류 : 오류 :'int * '유형의 표현식에서'int & '유형의 참조 초기화가 잘못되었습니다. – Overflowh