2016-08-10 3 views
1

Я просто объявил структуру, как это -Можно ли сравнить 2 структуры в C++?

struct data{ 
    int x,y; 
}; 

Теперь я объявивший 2 переменных a & b из data типа. Я присвоил им соответствующие значения. Теперь я хочу проверить, равны ли они! Я пытаюсь сделать так -

data a,b; 
a.x=12, a.y=24; 
b.x=15, b.y=30; 
if(a!=b)cout<<"a~b"<<endl; 

Но компилятор дает мне следующую ошибку на 4th линии ->

error: no match for 'operator!=' (operand types are 'data' and 'data')

Где проблема на самом деле? Разве это сравнение не поддерживается в C++? Или я ошибаюсь?

Что такое точный и простой способ сделать это? Нужно ли сравнивать каждый элемент в структуре отдельно? Или есть какой-то другой более умный способ?

+7

Выберите один язык. C ** или ** C++. – juanchopanza

+4

Вы должны реализовать 'bool operator! = (Const data &, const data &);'. – Jarod42

+2

Возможный дубликат оператора [No ==, найденного при сравнении структур в C++] (http://stackoverflow.com/questions/5740310/no-operator-found-while-comparing-structs-in-c) – bereal

ответ

2

C++ предоставляет атрибут-по-атрибута присваивания неявно, но никакого сравнения на равенство или упорядочивания. Причина в том, что «просто потому, что», не слишком усложняется в философии.

Вы должны предоставить эти операторы, в случае необходимости, путем реализации себя операторы в явном виде, например:

bool operator<(const Data& other) const { 
    if (x < other.x) return true; 
    if (x > other.x) return false; 
    return y < other.y; 
} 

bool operator==(const Data& other) const { 
    return x == other.x && y == other.y; 
} 

и так далее.

Отметьте также, что определение, например, ==, не дает вам != автоматически и определяет < не дает >= неявно.

+0

'return std :: tie (lhs.x, lhs.y) Jarod42

+0

Спасибо! Это сработало! :) – jbsu32

0

Вы должны ввести bool operator != (const data&, const data&);.

Возможная реализация (в C++ 11):

#include <tuple> 

//... 

bool operator == (const data& lhs, const data& rhs) { 
    return std::tie(lhs.x, lhs.y) == std::tie(rhs.x, rhs.y); 
} 

bool operator != (const data& lhs, const data& rhs) { 
    return !(lhs == rhs); 
} 
+0

Зачем нужен временный объект? – Inline

+0

Какой временный объект? – paulm

+0

@inline: Какой временный объект, по-твоему, я создаю? – Jarod42

4

Вы должны реализовать все операторы явно, что вы намерены использовать. В вашем случае вам нужно будет поставить bool operator!=(const data&, const data&).

Хороший способ реализовать его стручки, как это использовать std::tuple, поскольку он уже реализует заказ:

#include <tuple> 

// ... 

bool operator!=(const data& p_lhs, const data& p_rhs) 
{ 
    return std::tie(p_lhs.x, p_lhs.y) != std::tie(p_rhs.x, p_rhs.y); 
} 

std::tie (documentation) создает временный кортеж ссылок. Эти два кортежа можно сравнить, так как std::tuple определяет все операторы сравнения, так как shown here.

Я выбрал функцию operator!= как бесплатную функцию. Вы можете, конечно, выбрать для реализации его в качестве члена своего класса:

struct data 
{ 
    bool operator!=(const data& p_rhs) const 
    { 
     return std::tie(x, y) != std::tie(p_rhs.x, p_rhs.y); 
    } 

    int x, y; 
}; 

Конечно, вы должны определить все другие операторы тоже. Помните, что вы можете реализовать большинство операторов, делегируя другим пользователям.

+0

Я не знал о галстуке! Ваш ответ помог мне это узнать. Но, к сожалению, мои кодовые блоки не поддержали его :(Хотя я успешно запускаю его на www.ideone.com :) – jbsu32

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