2009-05-20 2 views
7

나는 목록 클래스의 멤버 클래스로 반복자 클래스를 만들려고 해요, 그리고 간접 연산자 (*)가 가리키는 대상리스트에 액세스 할 과부하하는 것을 시도하고있다 :간접 작업자에게 과부하를주는 방법은 무엇입니까? (C++)

template<class T> 
T list<T>::iterator::operator*(iterator& iter) 
{ 
    return ((iter.lstptr)->current)->data; 
} 

lstptr은 목록에 대한 포인터이고 current은 노드 클래스에 대한 포인터이고 노드 클래스는 T 데이터 멤버 data을 포함합니다.

반복자는 다음과 같이 선언한다 :

list<int> lst1; 
lst1.add(6); 
list<int>::iterator IT; 
IT = lst1; 
//everything above this point compiles fine 
int a = *IT; //error here (line fourteen) 

오류 : 잘 오버로드 연산자의 함수 정의 *을 컴파일하지만, 할 수 있어요

template<class T> 
class list 
{ 
public: 
class iterator; 
}; 

template<class T> 
class list<T>::iterator 
{ 
//stuff 
}; 

내가 좋아하는 뭔가를하려고 할 때 내가 말하길 < 1> 불법 간접 참조를 사용하고있다. < 2> list :: iterator를 int로 변환 할 수 없다. 두 오류 모두 14 번 라인에서 발생합니다.

아무도 내가 잘못하고있는 것을 알고 있고 간접 작업자를 올바르게 오버로드 할 수 있습니까?

NB : 더 많은 코드를 볼 필요가 있다면, 전체 코드를 여기에 올리고 싶지 않기 때문에 어떤 부분을 말해 주어야합니다. 왜냐하면이 코드는 205 행이고, 그 중 204 행은 그렇지 않기 때문입니다. 어떤 오류가 있습니다.

+0

" :: iterator IT; 목록을 입력 하시겠습니까?" - "목록 :: iterator IT"이어야합니다. 맞습니까? – leander

+0

@leander : 예, 해당 목록 실제 코드에서, 나는 단지 내 예제에서 그것을 입력 엉망. –

답변

12

곱하기 연산자가 오버로드되었습니다. 매개 변수를 간접적 인 연산자로 만들 수 있습니다.

template<class T> 
T list<T>::iterator::operator*() 
{ 
    return ((this->lstptr)->current)->data; 
} 

당신은 또한 당신이 컴파일 *IT = 3;과 같은 코드를 원하는 경우가 참조를 반환해야한다.

template<class T> 
T& list<T>::iterator::operator*() 
{ 
    return ((this->lstptr)->current)->data; 
} 
+1

곱셈 연산자가 아닙니다! 그러나 참조를 반환하는 것이 맞습니다. – Zifre

+4

그는 간접 연산자 인 자유 함수로 연산자 *를 작성해야합니다. 그것이 OP에 의해 쓰여졌 듯이, 그것은 곱셈 연산자입니다.나는 실제로 그것도 간과했는데, 그것이 회원으로 분명히 선언되었다는 사실을 완전히 무시했다. –

+0

그래서 "& ((this-> lstptr) -> current) -> data"를 반환 하겠는가? –

5

여기에는 두 가지 문제가 있습니다. 첫 번째는 사용자가 우연히 곱셈 연산자를 오버로드했고 역 참조 연산자를 오버로드 한 것이 아닙니다. 두 번째는 참조 유형을 반환하지 않았다는 것입니다.

첫 번째 문제는 매개 변수 수의 결과입니다. 클래스의 모든 비 정적 멤버 함수에는 추가 "숨김"매개 변수 인 this이 있습니다. this은 물론 함수가 호출되는 객체에 대한 포인터입니다. 결과적으로 실제로 두 매개 변수를 취하는 연산자 버전을 선언했습니다. 두 번째 이터레이터 매개 변수를 제거하고 this에서 작동하면 단항 *을 오버로드하고 이진 매개 변수는 오버로드합니다.

두 번째 문제는 반환 유형 중 사소한 문제입니다. 복사본을 원본 개체 자체가 아닌 원본 개체로 반환합니다. 리턴 유형을 T&으로 선언하여 참조를 리턴하십시오.

+0

+1. 반환 유형과 관련하여 기본 유형이 작은 값 유형이고 할당 할 수 없도록하려는 경우 OP가 수행하는대로 사본을 반환하는 것이 더 좋을 수 있지만 이는 예외적 인 경우입니다. coppro가 제안한대로 심판을 선호하십시오. –

관련 문제