2016-04-09 3 views
0

Я просто пишу свой первый объективно ориентированный проект в своем университете. Мне было трудно перегрузить == operator. В моем базовом классе Организме у меня естьОператор == перегружен не сравнивается

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 и Wolf наследует от Animal. Когда я пытаюсь сравнить

Fox f(1, 2); 
    Wolf w(1, 2); 
    Organizm *o1, *o2; 
    o1 = &f; 
    o2 = &w; 
    bool ok = (o1 == o2); 

Comparision возвращают ложь, даже если соответствующие переменные равны. Мне нужен оператор == для std :: find, потому что я сохраняю все свои организмы в std :: vector.

+1

Несвязанный с вашей проблемой, но вложенный 'if' эквивалентен логическому И, а сравнения возвращают логический результат. Итак, все, что вам нужно сделать в теле функции, - это 'return curr.x == other.x && curr.y == other.y;' –

+0

Также обратите пристальное внимание. Организм и Организм - это два разных слова. –

+0

Об этом Organism and Organizm im с использованием польских имен для классов, и когда я переводил его перед публикацией, я забыл изменить все. –

ответ

1

Вы не сравниваете эти объекты, и ваш оператор даже не вызывается.

Вы сравниваете указатели к этим объектам. Очевидно, что сравнение всегда терпит неудачу, поскольку два объекта не могут существовать одновременно в одном и том же месте.

Я полагаю, вы имели в виду, чтобы написать одно из следующих действий:

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); 
+0

Благодарим за быстрый ответ. Моя основная проблема заключается в том, что std :: find в векторной работе. Работает ли мой оператор == с std :: fing? –

+0

@SzymonStrzelka: Попробуйте и узнайте! –

+0

У меня \t 'vector organizmy; vector :: итератор i = world.organisms.начать(); \t \t o = this-> newAnimal (world, this-> x + _x, this-> y + _y); \t \t i = find (world.organisms.begin(), world.organisms.end(), o); ' и каждый раз находит что-либо. Хотя здесь есть элемент с теми же x и y –

1

Проблема заключается в том, что ваш код не сравнивает объекты; он сравнивает их адрес:

bool ok = (o1 == o2); // Compare address of f to address of w 

Если вы хотите сравнить объекты, на которые ссылаются указателями, вызов должен быть такой:

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

С

Organizm *o1 = &f; 
Organizm *o2 = &w; 
bool ok = (o1 == o2); 

Вы сравниваете указателей

Вы хотите

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

Для сравнения объектов используется пользовательский оператор.

Смежные вопросы