#cpp #классы #перегрузка_операторов
Я не могу до конца понять, как работает operator() внутри класса и, в принципе, в чем его отличие от методов. То есть в чем разница между class ManOlderThan { int m_age; public: ManOlderThan( int age ) { m_age = age; }; bool operator()( Man &man ) { if( man.GetAge() > m_age ) { return true; } else { return false; } }; }; class ManOlderThan { int m_age; public: ManOlderThan( int age ) { m_age = age; }; bool compare( Man &man ) { if( man.GetAge() > m_age ) { return true; } else { return false; } }; }; В том, как потом это вызывать? Или оператор нужен, когда метод только один? Или это вообще разные вещи? Вообще в данном случае оператор рассматривается в контексте векторов и for_each и find_if
Ответы
Ответ 1
Многие алгоритмы используют функциональные объекты для обработки элементов последовательности. В качестве этих функциональных объектов могут выступать функции или классы, имеющие оператор-функцию. Синтаксис вызова для функций и классов - функциональных объектов выглядит идентично. Это позволяет писать обобщенный код. Преимущество классов - функциональных объектов состоит в том. что они позволяют хранить состояние, а также использовать дополнительные поля данных помимо аргументов вызова. Посмотрите ниже демонстрационную программу, которая находит человека с возрастом больше заданного. Как видно из примера, использование функционального оператора-функции вместо вызова функции-члена класса значительно проще, а также функциональный объект может хранить дополнительную информацию - в данном случае значение 35. #include#include #include class ManOlderThan { int m_age; public: ManOlderThan( int age ) : m_age( age ) { } int GetAge() const { return m_age; } bool operator ()( const ManOlderThan &man ) const { return m_age < man.GetAge(); } bool compare( const ManOlderThan &man ) const { return m_age < man.GetAge(); } }; int main() { std::vector v = { 20, 30, 40, 50, 60 }; auto man = std::find_if( v.begin(), v.end(), ManOlderThan( 35 ) ); std::cout << man->GetAge() << std::endl; man = std::find_if( v.begin(), v.end(), []( const ManOlderThan &man ) { return ManOlderThan( 35 ).compare( man ); } ); std::cout << man->GetAge() << std::endl; return 0; } Вывод программы на консоль 40 40 То есть программа ищет первого человека в списке людей, заданного вектором, который старше 35 лет.
Комментариев нет:
Отправить комментарий