Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Функторы и операторы в C++

#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 лет.

Комментариев нет:

Отправить комментарий