操作员超载问题

时间:2013-09-18 23:32:49

标签: c++ overloading operator-keyword

我正在尝试比较一个名为Persons for Quicksort的对象列表。该对象包含名字,姓氏,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语句的内容。我很困惑,但这可能是一个非常愚蠢的错误。

2 个答案:

答案 0 :(得分:0)

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

if (B > pivot)

您正在比较内存地址。要解决这个问题,请尝试:

if (*B > *pivot)

顺便说一下,从这句话中删除分号:

if (B > pivot); // <- here

答案 1 :(得分: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::tiestd::tuple轻松实现,正如此主题所示:Implementing comparison operators via 'tuple' and 'tie', a good idea?