2010-12-06 10 views
1

처음에는 숙제인데, 나는 무엇을해야하는지 잘 알고 있지만 분명히 뭔가 빠져 있습니다.C++ - 알파벳순 문자열 - '<'연산자 과부하

현재 "Person"이라는 추상 기본 클래스가 있습니다. 그리고 나는 직원, 교수진, 학생 인 사람을 물려받는 3 가지 수업을 가지고 있습니다.

모든 "Person"이름을 성으로 정리하려고합니다. 따라서 '<'연산자를 오버로드해야합니다.

필자는이 함수를 작성했지만 필자는 어디에 넣어야할지 모른다.

기능 :

bool operator < (const Faculty &right) 
     { 
      if(getLastName() >= right.getLastName() == 0) 
       return true; 
      return false; 
     } 

내가 내 모든 파생 클래스의 헤더 파일에 넣고 경우, 또는 내가 기본 클래스 사람의 가상 함수로 넣어해야합니까? 아니면 둘 다해야합니까? 현재 나는 둘 다하고 있으며 모든 파일에 대해 오류가 발생합니다.

오류 :

error C2662: 'Person::getLastName' : cannot convert 'this' pointer from 

업데이트 : 내가 내 기능을 변경 : 다른 사람의 조언을받은 후

bool operator < (const Person &right) 
    { 
     return LastName >= right.getLastName(); 
    } 

, 난 단지 "사람이 기능을 배치했다 "가상으로 만들지 않았습니다. 그러나 나는 여전히이 기능을 가리키는 똑같은 정확한 오류 5 개를 얻고있다.

오류 : 전혀 여기에 사람을 도움이 내 "Person.h"에 대한 코드의 경우

'Person::getLastName' : cannot convert 'this' pointer from 'const Person' to 'Person &' 

: 첫째

class Person 
{ 
    private: 
     string FirstName, 
       LastName, 
       MiddleName, 
       SSN; 

     string FullName; 

    public: 
     Person(); 
     Person(string, string, string, string); 
     Person(string); 

     string getFirstName(); 
     string getLastName(); 
     string getMiddleName(); 
     string getSSN(); 
     string getFullName(); 

     void setFirstName(string); 
     void setLastName(string); 
     void setMiddleName(string); 
     void setSSN(string); 
     void setFullName(string); 

     virtual string getIdentity() 
     { 
      return FirstName + " " + MiddleName + " " + LastName + " " + SSN; 
     } 

     bool operator < (const Person &right) 
     { 
      return LastName >= right.getLastName(); 
     } 

     virtual string getPurpose() = 0; 

}; 
+0

오류 출력이 잘립니다. 전체 오류 메시지를 게시하십시오. – robert

+0

오류는 정말로 질문과 관련이 없습니다. http://msdn.microsoft.com/en-us/library/2s2d2tez%28VS.80%29.aspx'getLastName'은 'const' 멤버 함수 여야합니다. (나는'getLastName'은 당신의'operator <'가 const가 아닌 것에 기초하여 non-const라고 생각합니다). –

+0

@Steve Jessop : 오류를 볼 수 없기 때문에 오류가'const' -ness와 관련이 있는지 알 수 없습니다. 당신의 링크는 단지 그 문제가'const'-ness와 관련이 있음을 암시합니다. – robert

답변

2

을 당신이에 연산자를 호출 할 때 당신은 아마 얻을 오류가 발생합니다 const 개체. 컴파일러는 operator<이 호출 된 개체를 변경하지 않으므로 오류가 발생한다는 것을 알지 못합니다. 함수가 객체를 변경하지 않는 것을 보장하기 위해, const로 함수를 선언 : 함수는 상수 개체에 대한

bool operator < (const Faculty &right) const { 
    ... 
} 

이 방법을 호출 할 수 있습니다. getLastName()도 아마도 const이어야합니다.

string getFirstName(); 
    string getLastName(); 
    string getMiddleName(); 
    string getSSN(); 
    string getFullName(); 

함수의 변경 가능한 버전이없는 당신이 오류를 제공하기 때문이다

string getFirstName() const; 
    string getLastName() const; 
    string getMiddleName() const; 
    string getSSN() const; 
    string getFullName() const; 

로 : 당신이에서 게터를 추가하거나 변경해야 할 수도 있습니다처럼

+0

컴파일러가 constness를 추론하지 못한다. 그것은 저에게 이것이 이것을 포함하여 할 수있는 많은 경우가있는 것처럼 보입니다. –

4

,이 모든 사람들을 작업 할 , 그래서 그것을 Person에 넣어야합니다. 그리고 두 사람을 비교하기를 원하므로 RHS가 사람이어야합니다.

또한 논리는 이중 부정입니다. 왜 그렇게 할 지 확신하지 못합니다. ...

bool operator < (const Person &right) 
     { 
      return getLastName() < right.getLastName(); 
     } 

... 훨씬 더 의미가 있습니다.

+0

그 모든 것들을 바꿨고 "Person"에 함수를 넣었습니다. 그러나 똑같은 라인을 가리키는 동일한 오류가 5 개 발생했습니다. \t 오류 1 오류 C2662 : 'Person :: getLastName': 'this'포인터를 'const Person'에서 'Person &'으로 변환 할 수 없습니다. - Johnny Whisman 0 초 전 편집 – Johnrad

1

Person 클래스에 넣어야하며, 순서를 변경해야하는 파생 클래스를 상상할 수 없다면 가상 일 필요는 없습니다. 주어진 이름의 정렬은 Person의 다른 분류에 따라 다른 것으로 보이지 않지만 virtual은 표시되지 않습니다.

인수는 const Person&이어야하며, 기능 자체 {가 구현 도입하거나 전에 넣어 (const을해야한다 -.이 구현은 ; 후행

EDIT 전에 광고를 벗어나면 : 아래에 구현을 추가했습니다.

  • operator<이 멤버 함수이므로 공개 멤버 함수 (예컨대 getLastName())을 통과하지 않고 전용 멤버 변수에 액세스 할 수

    유의할 것들. 공용 멤버 함수를 사용하는 것이 한 가지 의미로 (구현 변경으로 인해 다시 작성해야 할 필요성이 적다) 좋지만, 필자는 아래에 게으르다가 짧은 직접 액세스를 사용했습니다.

  • 계단식 비교는 LastName이 같은 경우 다른 필드에서 비교할 수 있도록합니다. 이것은 동일한 이름을 가진 두 사람조차도 예측 가능하고 반복 가능한 주문을 보장하기 위해 독창적이라고 생각되는 SSN을 비교하는 것으로 결론 지어집니다. Person 개의 개체에 대해 '안정적인'정렬 순서를 원한다면 필수적입니다. std::map<Person, XXX>에서 이러한 개체를 사용하는 데 필요합니다. 경험이 많으면 좀더 자세한 경향이 있고 때로는 실행 속도가 느려지므로 operator<을 이렇게 안정하게 작성하는 것이 좋습니다.

구현 :

bool operator<(const Person& right) const 
{ 
    return LastName < right.LastName ? true : 
      LastName > right.LastName ? false : 
      FirstName < right.FirstName ? true : 
      Firstname > right.FirstName ? false : 
      MiddleName < right.MiddleName ? true : 
      MiddleName > right.MiddleName ? false : 
      SSN < right.SSN; // assume SSN is guaranteed unique 
} 

... 이것이 쓰기의 또 다른 인기있는 방법 ...

bool operator<(const Person& right) const 
{ 
    return LastName < right.LastName || 
      LastName == right.LastName && 
       (FirstName < right.FirstName || 
       Firstname == right.FirstName && 
        (MiddleName < right.MiddleName || 
        MiddleName == right.MiddleName && 
         SSN < right.SSN)); // assume SSN is guaranteed unique 
} 
+0

그 모든 것들이 바뀌었고 방금 함수를 넣었습니다. "Person"에 있지만 여전히 같은 정확한 라인을 가리키는 5 개의 동일한 오류가 발생합니다. – Johnrad

+0

오류 오류 C2662 : 'Person :: getLastName': 'this'포인터를 'const Person'에서 'Person'으로 변환 할 수 없습니다. – Johnrad

+0

@Johnny Whisman : 업데이트 된 코드에 권장 된대로 'const'가 표시되지 않습니다. 이 대답의 두 번째 단락. –

2

그것은 본다 Person 인스턴스,하지만 const 게터가 없으므로 게터를 전혀 사용할 수 없습니다!