2013-06-12 2 views
0

나는 Item 클래스 개체를 가리키는 Item Pointer 클래스에 대해 연산자 < 오버로드를 구현하는 방법을 파악하려고합니다. STL 세트의 항목에 대한 포인터를 저장하는 프로그램의 일부입니다. 과부하는 정렬 된 STL 세트 (제목순 알파벳순)에 필요합니다. 아래 코드에서 ItemPtr 오버로드에 대한 코드가 잘못되었다는 것을 알고 있습니다. 포인터를 역 참조하여 실제 항목을 가져올 수 있다고 생각했지만 구현 방법을 모르겠습니다. 나는 바른 길을 가기를 바랍니다. 누구든지 공유 할 수있는 어떤 포인터 (아무 말장련도 의도하지 않음)에 감사드립니다.오버로드 연산자 <클래스 개체에 대한 포인터

bool operator<(const Item& i1, const Item& i2) 
{ 
    const char* str1 = i1.getTitle().c_str(); 
    const char* str2 = i2.getTitle().c_str(); 
    return strcmp(str1, str2); 
} 

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) 
{ 
    const Item& i1 = *ip1; 
    const Item& i2 = *ip2; 
    return i1 < i2; 
} 

감사합니다.

+0

왜 단순히'return ItemPtr1-> getTitle() < ItemPtr2-> getTitle()'이 아닌가? –

+0

친구 기능 또는 클래스 기능입니까? – IanPudney

+0

"어떻게 추론 작업을 작성합니까?" – doctorlove

답변

2

간단한 방법, 당신은 set에는 유효하지 않은 포인터가없는 보장 가정 및 getTitle()const입니다 :

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) 
{ 
    return ip1->getTitle() < ip2->getTitle(); 
} 

내가 이런 일을 할 필요하면 뭔가가 있다는 것을 감각을 유발한다는 그러나주의 할 디자인에 문제가있을 수 있습니다. 특히 Item 자체가 아닌 setItem에 대한 포인터를 저장하는 이유는 무엇입니까? 이것은 정말로 필요한 것입니까?

+0

나는 그것을 시도 할 것이다, 고마워! 필자는 디자인이 이상하다는 것에 동의합니다. 이는 항목 포인터를 다양한 세트에 저장하고 키워드에 따라 인덱싱 된 집합을 포함하는지도에 저장되도록 구성된 할당에 의해 결정됩니다. 나는 이것이 왜 이렇게 설정되었는지 이해하지 못한다. 모든 항목이 상수 포인터로 일정한 항목으로 설정되어 있기 때문에 const 정확성과 관련이있다. 정말 구현 루프에 나를 던지고있다 - 도와 줘서 고마워! – user2479147

0

구현에 잘못된 것은 ItemPtr의 비교,하지만 Item의 비교되지 않습니다 str1str2이 다른 경우 strcmp()가 제로가 아닌 값을 반환, 0이 아닌 값을 반환은 true을 의미한다. 동시에 a < bb < a 인 경우 주문한 요소를 가져올 수 없습니다. ItemPtr 비교는 Item 비교의 기능으로 구현되었으므로 동일한 문제가 발생합니다.

존 Dibling에 의해 주어진 솔루션은 간단하고 ItemPtr 항상 유효한 Item 참조 포함되어 있는지 맞아요 경우 :

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) 
{ 
    return ip1->getTitle() < ip2->getTitle(); 
} 

어쨌든 Item의 비교해야하는 경우를 :

bool operator<(const Item& i1, const Item& i2) 
{ 
    return i1.getTitle() < i2.getTitle(); 
} 
bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) 
{ 
    return *i1 < *i2; 
} 

ItemPtr에 유효한 참조를 저장할 수 없다면이 경우를 확인해야합니다. (그러나 아마 당신은 그것을 추측 할 수 있습니다).