1

手始めに、これは宿題です。私は自分が何をすべきかをよく理解していますが、明らかに何かが欠けています。

現在、「Person」という抽象基本クラスがあります。そして、私には、スタッフ、教員、学生の3つのクラスがあります。

すべての「人」の名前を名前で整理しようとしています。したがって、「<」演算子をオーバーロードする必要があります。

関数を書いたのですが、どこに置けばいいのかわかりません。

働き:

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

これをすべての派生クラスのヘッダーファイルに入れる必要がありますか、それとも基本クラスのPersonに仮想関数として入れる必要がありますか?または私は両方を行う必要があります。現在、両方を実行していますが、すべてのファイルでエラーが発生します。

エラー:

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

更新: 関数を次のように変更しました:

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

他の人からアドバイスをもらった後、この機能を「Person」に配置しただけで、仮想化はしていません。それでも、すべてがこの関数を指しているのとまったく同じエラーが5つ発生しています。

エラー:

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

それが誰かを助けるなら、ここに私の「Person.h」へのコードがあります:

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;

};
4

4 に答える 4

4

まず、これをすべての人に適用したいので、Personに配置する必要があります。そして、あなたは任意の2人を比較したいので、RHSは人でなければなりません。

また、ロジックは二重否定です。なぜそうするのかわかりませんが...

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

...はるかに理にかなっています。

于 2010-12-06T01:06:06.263 に答える
2

発生するエラーは、オブジェクトに対してオペレーターを呼び出そうとしたときに発生する可能性がありconstます。コンパイラはoperator<、それが呼び出されたオブジェクトを変更しないことを認識していないため、エラーが発生します。関数がオブジェクトを変更しないようにするには、関数を次のように宣言しますconst

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

このようにして、関数は定数オブジェクトに対しても呼び出すことができます。getLastName()おそらくまたあるべきですconst

于 2010-12-06T01:14:19.647 に答える
2

ゲッターを次の場所から追加または変更する必要があるようです。

    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;

これは、エラーを発生させる関数にPersonインスタンスの変更可能なバージョンがないためですが、constゲッターがないため、ゲッターをまったく使用できません。

于 2010-12-06T02:11:40.307 に答える
1

それをPersonクラスに配置する必要があります。派生クラスが順序を変更する必要があると想像できない場合は、仮想である必要はありません。与えられた名前の並べ替えは、Personの分類ごとに異なるものではないようですが、virtual示されていません。

引数はである必要がconst Person&あり、関数自体を作成する必要がありますconst(実装を導入する直前{、または実装がラインから外れている場合は末尾の。の前に配置し;ます。

編集:以下に実装を追加しました。

注意事項:

  • operator<はメンバー関数であるため、パブリックメンバー関数(eg getLastName())を経由せずにプライベートメンバー変数にアクセスできます。パブリックメンバー関数を使用することは、ある意味では優れています(実装の変更のために書き直す必要が少なくなります)が、私は以下で怠惰になり、より短い直接アクセスを使用しました。
  • LastNamesが等しい場合に他のフィールドで比較することを保証するための、カスケード比較など。これは、同じ名前の2人でも予測可能で繰り返し可能な順序を持つことを保証するために、私が一意であると想定する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
}
于 2010-12-06T01:07:18.620 に答える