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 中。你想比较任何两个人,所以 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 实例的可变版本,但是没有constgetter,所以它根本不能使用任何 getter!

于 2010-12-06T02:11:40.307 回答
1

您应该将它放在您的 Person 类中,如果您无法想象派生类需要更改顺序,它不需要是虚拟的。鉴于名称的排序似乎不会因 Person 的不同分类而有所不同,virtual因此未指明。

参数应该是 a const Person&,并且应该制作函数本身const(将其放在{引入实现之前,或者 - 如果实现不合时宜,则在尾随;.

编辑:我在下面添加了一个实现。

注意事项:

  • operator<是一个成员函数,因此可以访问私有成员变量而无需通过公共成员函数(例如getLastName())。从某种意义上说,使用公共成员函数更好(由于实现更改而需要重写的机会更少),但我在下面一直很懒惰并使用了更短的直接访问。
  • 级联比较以确保我们在LastNames 相等时在其他字段上进行比较,依此类推。最后比较 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 回答