처음으로 첨자 연산자를 오버로드하고 참조 값을 반환하는 데 문제가 있습니다.
나는 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;
진술에 있다고 생각했지만, 그것이 틀릴 수도 있고 다른 오류가있을 수도 있다고 생각하지도 못한다.
아이디어가 있으십니까?
미리 감사드립니다.
먼저 실수'(인덱스> 사이즈) '(또는보다 "시각적"'(크기 <= 인덱스) ') (인덱스> = 사이즈)'되어야 왜냐하면'index'의 유효 범위는'[0, size-1]'(즉'[0, size]')라고 생각하기 때문입니다. 둘째로, 실행이'(b-> position == index)'조건을 결코 만족시키지 않고'b'가 null이 될 때 루프를 빠져 나가면 어떻게 될까? 함수에 의해 반환되는 것은 없으며 정의되지 않은 동작이므로 오류 케이스도 처리해야합니다. –
@ gx_ 반환 값이없는 경우를 처리 할 제안이 있습니까? 나는 이미 오류를 고려했지만 나중에 수정할 수 있도록 기록을 남겼다. – Overflowh
코드의 내부 구조를 알지 못합니다. 논리적으로는 결코 일어나지 않아야합니다. (즉, 각각의 유효한'index'에 대해'블록'에'equal'이 존재한다고 가정한다면) linked-list) 'while'본문 뒤에 (또는 함수 본문의 끝 바로 앞에) 어설 션을 넣거나 (위와 같이 오류를 출력하고 종료 할 수 있습니다) 가정합니다. 그렇게하고 나면 첫 번째 의견의 수정 사항을 적용한 후에도 프로그램이 여전히 중단됩니까? 그리고/또는 어떤 에러 메시지를 출력합니까? –