0

lname フィールドを持つ user というクラスがあります。これは「<」演算子をオーバーロードする正しい方法ですか?

bool User::operator<(const User& other)
{
    std::cout << "< operator was called" << std::endl;
    if (this != &other)
    {
        if (lname.compare(other.lname) == 0)
        {
            return true;
        }
    }
    return false;
}

私はこれをより複雑なセットで使用しようとしていますが、失敗しています.これが正しいことを確認したいだけです.

4

4 に答える 4

3

他の人が指摘しているように、あなたoperator<は左側を にすることを許可していませんconst。関数シグネチャをに変更

bool User::operator<(const User& other) const

改善です。しかし、実際には、代わりに非メンバー関数にすることをお勧めします。

class User {
public:
    friend bool operator<(const User& u1, const User& u2);
    // ...
};

bool operator<(const User& u1, const User& u2)
{
    // ...
}

一つには、私の意見ではもう少し読みやすいです。

また、技術的な違いが生じることもあります。非メンバー関数を使用すると、式は と の両方でa < b暗黙的な変換を試みて、 yourが実行可能なオーバーロードであるかどうかを確認します。ただし、メンバー関数を使用すると、暗黙的な変換は に適用できますが、 には適用できません。型または派生型である必要があります。これは、コンパイルはするがしないという驚くべき状況につながる可能性があります。aboperator<baaUsera < bb < a

于 2012-10-26T03:04:54.733 に答える
2

「lname」フィールドをプライベートとして非表示にする方が良いようです。

return lname.compare(other.getName()) < 0;
于 2012-10-26T03:07:02.847 に答える
1

実装する正しい方法operator<は、const 関数としてです。

bool User::operator<( const User& other ) const

これは、関数がそのメンバーを変更しないため、クラスの const インスタンスで呼び出すことができることを意味します。

于 2012-10-26T02:57:22.643 に答える
1

試す:

bool User::operator<(const User& other) const
{
    return lname.compare(other.lname) < 0;
}
于 2012-10-26T02:56:27.840 に答える