-1

我正在尝试比较一个名为 Persons 的对象列表以进行快速排序。该对象包含名字、姓氏、SSN 和电话号码的字符串,以及一些有用的成员。

class Person
{
protected:
string firstname, lastname, social, birthday;
 public:
Person(string, string, string, string); //store all values in strings for easy comparison and because no manipulation is necessary
~Person();  
string Get(int type); //allows retrieval of protected members of object
void Print();
bool operator > (const Person& pivot) const;
//bool operator < (const Person &pivot);
};

我正在尝试使用运算符重载来确定两个 Person 对象中的哪一个更大。

bool Person::operator > (const Person& pivot) const
{
if(this->firstname > pivot.firstname)
    return true;
if(this->firstname < pivot.firstname)
    return false;
if(this->lastname > pivot.lastname)
    return true;
if(this->lastname < pivot.lastname)
    return false;
if(this->birthday > pivot.birthday)
    return true;
if(this->birthday < pivot.birthday)
    return false;
if(this->social > pivot.social)
    return true;
if(this->social < pivot.social)
    return false;
}

但是,这似乎根本不起作用,因为当我跑步时

Person * B = new Person("1234", "Donny", "Smith", "123456780");
Person * pivot = new Person("9345", "John", "Phillip", "234598765");
if (B > pivot);
    cout << "hooray\n";
if(pivot > B)
    cout << "Not hooray\n";

两个 if 语句的内容都被执行。我完全糊涂了,但这可能是一些非常愚蠢的错误。

4

2 回答 2

0

您将 B 和 pivot 声明为指针。所以,基本上,你是在比较指针。当你这样做时:

if (B > pivot)

您正在比较内存地址。要解决此问题,请尝试执行以下操作:

if (*B > *pivot)

顺便说一句,从这个语句中删除分号:

if (B > pivot); // <- here
于 2013-09-18T23:38:52.830 回答
0

首先,正如 Avi 注意到的,if 语句中有一个分号。

其次,您正在使用指针/动态内存(Java 风格)实例化对象:这是一个错误。实际上,您要比较的是指针,而不是对象。

不需要时不要使用动态内存。使用局部变量:

Person B("1234", "Donny", "Smith", "123456780");
Person pivot("9345", "John", "Phillip", "234598765");

if (B > pivot)
    std::cout << "hooray" << std::endl;
if(pivot > B)
    std::cout << "Not hooray" << std::endl;

边注:

这种复杂的比较可以通过std::tieand轻松实现std::tuple,正如该线程所示:通过 'tuple' 和 'tie' 实现比较运算符,一个好主意吗?

于 2013-09-18T23:40:14.657 回答