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" 函数(运算符)?。
我在做什么?
personBirth
是BirthdayPerson*
的数组。您需要取消引用指针以比较它们指向的对象:
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
如果比较指针,则不会调用重载函数。比较地址。又失败了。
好的。我有结构:
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" 函数(运算符)?。 我在做什么?
personBirth
是BirthdayPerson*
的数组。您需要取消引用指针以比较它们指向的对象:
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
如果比较指针,则不会调用重载函数。比较地址。又失败了。