C++ 运算符==重载不进行比较

C++ 运算符==重载不进行比较,c++,operator-overloading,C++,Operator Overloading,我正在大学写我的第一个面向对象的项目。我发现重载==运算符很困难。 在我的基类有机体中 friend bool operator==(const Organism &curr, const Organism &other); bool operator==(const Organizm &curr, const Organizm &other) { if (curr.x == other.x) { if (curr.y == other.y

我正在大学写我的第一个面向对象的项目。我发现重载==运算符很困难。 在我的基类有机体中

friend bool operator==(const Organism &curr, const Organism &other);
bool operator==(const Organizm &curr, const Organizm &other) {
    if (curr.x == other.x) {
        if (curr.y == other.y)
            return true;
    }
    return false;
}
动物遗传自有机体,狐狸和狼遗传自动物。 当我试着比较

    Fox f(1, 2);
    Wolf w( 1, 2);
    Organizm *o1, *o2;
    o1 = &f;
    o2 = &w;
    bool ok = (o1 == o2);
即使正确的变量相等,比较也返回false。
对于std::find,我需要操作符==因为我将所有的有机体都保存在std::vector中。

您没有比较这些对象,您的操作符甚至没有被调用

您正在将指针与这些对象进行比较。显然,比较总是失败的,因为两个对象不能同时存在于同一个地方

我想你是想写以下任何一个:

Fox f(1, 2);
Wolf w(1, 2);

Organizm* o1 = &f;
Organizm* o2 = &w;

const bool ok = (*o1 == *o2);
或者更好:

Fox f(1, 2);
Wolf w(1, 2);

const Organizm& o1 = f;
const Organizm& o2 = w;

const bool ok = (o1 == o2);
或者,简单地说:

Fox f(1, 2);
Wolf w(1, 2);

// implicit conversions are a thing!
const bool ok = (f == w);

您没有比较这些对象,甚至没有调用运算符

您正在将指针与这些对象进行比较。显然,比较总是失败的,因为两个对象不能同时存在于同一个地方

我想你是想写以下任何一个:

Fox f(1, 2);
Wolf w(1, 2);

Organizm* o1 = &f;
Organizm* o2 = &w;

const bool ok = (*o1 == *o2);
或者更好:

Fox f(1, 2);
Wolf w(1, 2);

const Organizm& o1 = f;
const Organizm& o2 = w;

const bool ok = (o1 == o2);
或者,简单地说:

Fox f(1, 2);
Wolf w(1, 2);

// implicit conversions are a thing!
const bool ok = (f == w);

问题是你的代码不比较对象;它比较了他们的地址:

bool ok = (o1 == o2); // Compare address of f to address of w
如果要比较指针引用的对象,调用应如下所示:

bool ok = (*o1 == *o2);

问题是你的代码不比较对象;它比较了他们的地址:

bool ok = (o1 == o2); // Compare address of f to address of w
如果要比较指针引用的对象,调用应如下所示:

bool ok = (*o1 == *o2);

你在比较指针

你想要

bool ok = (*o1 == *o2);
使用自定义运算符比较对象。

你在比较指针

你想要

bool ok = (*o1 == *o2);

使用自定义运算符比较对象。

与问题无关,但嵌套if等效于逻辑AND,比较返回布尔结果。因此,在函数体中只需返回curr.x==other.x&&curr.y==other.y;另外,请密切关注。Organism和Organizm是两个不同的词。关于Organism和Organizm,我用波兰语命名类,当我在发帖前翻译它时,我忘记了改变所有你遇到困难的原因,因为你被迫在一个没有意义的环境中使用面向对象编程。与你的问题无关,但是嵌套if等价于逻辑AND,并且比较返回布尔结果。因此,在函数体中只需返回curr.x==other.x&&curr.y==other.y;另外,请密切关注。Organism和Organizm是两个不同的词。关于Organism和Organizm,我用波兰语给类命名,当我在发布之前翻译它时,我忘记了改变所有的原因。你遇到困难的原因是因为你被迫在一个没有意义的环境中使用面向对象编程。谢谢你的快速回复。我的主要问题是在向量工作中生成std::find。我的操作符==在std::fing上工作得好吗?@SzymonStrzelka:试试看!我有向量组织;向量::迭代器i=world.orbiats.begin;o=这个->新动物世界,这个->x+\uX,这个->y+\uY;i=findworld.Organiss.begin,world.Organiss.end,o;它每次都能找到任何东西。即使这里有一个x和x相同的元素y@SzymonStrzelka:向量不包含组织。它包含指针。因此,您的std::find操作需要构建一个解引用操作,就像您自己的代码一样,正如我在回答中所示。因此,我需要查找world.orbias.begin,world.orbias.end,*o?感谢您的快速响应。我的主要问题是在向量工作中生成std::find。我的操作符==在std::fing上工作得好吗?@SzymonStrzelka:试试看!我有向量组织;向量::迭代器i=world.orbiats.begin;o=这个->新动物世界,这个->x+\uX,这个->y+\uY;i=findworld.Organiss.begin,world.Organiss.end,o;它每次都能找到任何东西。即使这里有一个x和x相同的元素y@SzymonStrzelka:向量不包含组织。它包含指针。因此,您的std::find操作需要构建一个解引用操作,就像您自己的代码一样,正如我在回答中所示。因此,我需要findworld.Organiss.begin、world.Organiss.end、*o?