C++字母串-“

C++字母串-“,c++,string,operator-overloading,alphabetical,C++,String,Operator Overloading,Alphabetical,首先,这是家庭作业,我对我应该做什么有很好的理解,但我显然错过了一些东西 我目前有一个抽象基类,名为Person。我有三个班,分别是教职员工、教员和学生 我正试图按姓氏来组织所有人的名字。所以我必须让“超载,首先,你想让它对所有人都有效,所以你应该亲自去做。你想比较任何两个人,所以RHS应该是一个人 而且,你的逻辑是双重否定的。我不知道你为什么要这么做,当 bool operator < ( const Person &right ) { r

首先,这是家庭作业,我对我应该做什么有很好的理解,但我显然错过了一些东西

我目前有一个抽象基类,名为Person。我有三个班,分别是教职员工、教员和学生


我正试图按姓氏来组织所有人的名字。所以我必须让“超载,首先,你想让它对所有人都有效,所以你应该亲自去做。你想比较任何两个人,所以RHS应该是一个人

而且,你的逻辑是双重否定的。我不知道你为什么要这么做,当

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

。。。这更有意义。

首先,你想让它适用于所有人,所以你应该亲自去做。你想比较任何两个人,所以RHS应该是一个人

而且,你的逻辑是双重否定的。我不知道你为什么要这么做,当

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

。。。更有意义。

您应该将它放在Person类中,如果您无法想象派生类需要更改顺序,那么它不需要是虚拟的。鉴于名字的排序似乎不会因不同类别的人而有所不同,虚拟的名字就不存在了

参数应该是const Person&,函数本身应该在{引入实现之前,或者-如果实现不一致,则在trailing;之前设置const put

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

注意事项:


运算符您应该将其放在Person类中,如果您无法想象派生类需要更改排序,则它不需要是虚拟的。给定名称的排序似乎不会因Person的不同分类而有所不同,因此不会指示虚拟

参数应该是const Person&,函数本身应该在{引入实现之前,或者-如果实现不一致,则在trailing;之前设置const put

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

注意事项:


运算符当您尝试调用常量对象上的运算符时,可能会发生错误。编译器不知道该运算符当您尝试调用常量对象上的运算符时,可能会发生错误。编译器不知道该运算符看起来您可能需要从以下位置添加或更改getter:

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


这是因为给出错误的函数没有Person实例的可变版本,但是没有常量getter,因此它根本不能使用任何getter!

看起来您可能需要添加或更改getter,从:

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



这是因为提供错误的函数没有Person实例的可变版本,但是没有常量getter,因此它根本不能使用任何getter!

您的错误输出被切断。请发布整个错误消息。错误与您的问题没有真正的关系:getLastName应该是常量成员函数。我猜getLastName是非常量的,因为operator@Steve杰索普:你不知道错误与常数有关,因为你看不到错误。你的链接只是暗示问题可能与常数有关。@robert:我的评论中解释过,有根据的猜测。我已经对我的问题添加了更新。你的错误输出被切断了。请发布整个错误消息。该错误与您的问题无关:getLastName应该是一个常量成员函数。我猜getLastName是非常量的,因为您的operator@Steve杰索普:你不知道这个错误与常数有关,因为你看不到这个错误。你的链接只是暗示了这个问题可能与const ness有关。@robert:根据我的评论,这是一个有根据的猜测。我已经对我的问题添加了更新。我更改了所有这些内容,并且我只是亲自将函数放入,但仍然有5个相同的错误指向同一行。错误1错误C2662:“Person::getLastName”:无法将“this”指针从“const Person”转换为“this”致“Person&@Johnny Whisman:您更新的代码没有显示此答案第二段中建议的常量。@Johnny:您还需要使所有未设置/修改成员变量的函数都为常量,这样它将保持一致并正常工作。为什么?因为如果您有一个常量Person&那么您只能调用常量成员这个人身上的函数…你需要调用GetLastName,所以它也必须是const。我更改了所有这些内容,我只是将函数放在了这个人身上,但仍然有5个相同的错误指向同一行。错误1错误C2662:“person::GetLastName”:无法将“this”指针从“const person”转换为“person&@Johnny Whisman:你r更新后的代码没有显示此答案第二段中建议的常量。@约翰尼:您还需要生成所有未设置/mo的函数
dify成员变量const,那么它将是一致的,并且可以正常工作。为什么?因为如果您有一个const Person,那么您只能对该Person调用const成员函数。。。你需要调用GetLastName,所以它也必须是const。我改变了所有的东西,我只是亲自把函数放进去,但仍然有5个相同的错误指向同一行。错误1错误C2662:“Person::getLastName”:无法将“this”指针从“const Person”转换为“Person&”-Johnny Whisman 0秒前编辑我更改了所有内容,我只是将函数亲自放入,但仍有5个相同的错误指向同一行。错误1错误C2662:“Person::getLastName”:无法将“this”指针从“const Person”转换为“Person&”-Johnny Whisman 0秒前编辑太糟糕了编译器无法推断constness。在我看来,有很多情况下它可以,包括这一个。太糟糕了,编译器没有推导常量。在我看来,有很多情况下,它可以,包括这一个。
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;

};
bool operator < ( const Person &right )
        {
            return getLastName() < right.getLastName();
        }
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
}
bool operator < ( const Faculty &right ) 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;