#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 лет.
Комментариев нет:
Отправить комментарий