C++ 重载单个运算符将 2 个结构作为指针传递

C++ overloading single operator passing 2 structures as pointers

好的。我有结构:

struct birthdayPerson
{
    int day, month, year;
    public:
        void Show()
        {
            std::cout << day << " " << month << " " << year << std::endl;
        }
};

然后我想重载“==”,以便它可以比较 2 个已设置的结构(如果这些人的生日(日期和月份)相同)。我有一个这个结构的 2 元素数组指针:

birthdayPerson * personBirth[2];
personBirth[0] = new birthdayPerson;
personBirth[1] = new birthdayPerson;

然后我这样重载:

bool operator==(birthdayPerson person1, birthdayPerson person2)
{
    return (person1.day == person2.day &&
    person1.month == person2.month);
}

最后我在代码中使用:

bool sameBirthDay = personBirth[0] == personBirth[1];

但是,为什么它不调用 "overladed" 函数(运算符)?。 我在做什么?

personBirthBirthdayPerson*的数组。您需要取消引用指针以比较它们指向的对象:

bool sameBirthDay = *personBirth[0] == *personBirth[1];

否则你是在比较2个指针,这不是一回事。 (以及它没有在 birthdayPerson 上呼叫您的 operator== 的原因)。

此外,我看不出您在这段代码中使用指针的任何原因。您可以只创建对象。如果你想要一个对象的集合,使用std::vector,或者如果你在编译时知道你需要的对象的数量,你可以使用std::array.

这与您的问题无关,但正如@RemyLebeau 在他们的回答中指出的那样,您的 operator== 不是惯用语。签名应该改为:

bool operator==(birthdayPerson const &person1, birthdayPerson const &person2);

否则,您正在对正在比较的对象进行不必要的复制。

首先,您的 operator== 应该通过 const 引用获取其参数:

bool operator==(const birthdayPerson &person1, const birthdayPerson &person2)

其次,您的数组包含 birthdayPerson* 指针 ,而不是实际的 birthdayPerson 对象 。您的语句 personBirth[0] == personBirth[1] 正在比较指针,这就是不调用您的运算符的原因。您需要引用指针才能正确比较对象:

bool sameBirthDay = *(personBirth[0]) == *(personBirth[1]);

否则,更改数组以保存对象,而不是指向对象的指针:

birthdayPerson personBirth[2];
...
bool sameBirthDay = personBirth[0] == personBirth[1];

你发起他们了吗?如果不是,则失败。您没有默认值。

bool operator==(birthdayPerson person1, birthdayPerson person2)
{
    std:: cout << person1.day <<" "<<person2.day<<"\n";
    return (person1.day == person2.day &&
    person1.month == person2.month);
}

如果没有发起:

4196144 32766

如果比较指针,则不会调用重载函数。比较地址。又失败了。