Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 27.02.2021
Сообщений: 89
1

Функциональный объект

08.10.2021, 13:47. Показов 649. Ответов 5
Метки с++ (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как из этого кода сделать так, чтоб использовался функциональный объект в классе, а не обычная функция ( что в классе определялся operator () // параметры ). Задание в коде: хранение метода сортировки от большего к меньшему и за алфавитом в случае равно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <algorithm>
#include <iostream>
#include <string>
 
using namespace std;
 
// класс чисел
class NUMBER
{
public:
    int value{}; // значения
    string title;
};
 
// метод сортировки от большего к меньшему
bool Greater(const NUMBER& a, const NUMBER& b)
{
    if (a.value == b.value) // если значения равны
    {
        return a.title < b.title; // то первое числа меньше второго
    }
 
    return a.value > b.value; // иначе первое больше второго числа
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "==================================================" << endl;
    cout << "> Имеется четыре(4) числа: x=24, y=30, a=30, z=28. " << '\n';
    cout << endl;
    cout << "> Отсортируем числа от большего к меньшему, " << endl << "если они равны, то сортируем за алфавитом." << endl;
    cout << "==================================================" << endl;
    cout << endl;
    cout << "> Результат:" << endl;
    cout << endl;
 
    NUMBER vecNUMBER[] // массив чисел
    {
        {24, "X"}, // х = 24
        {30, "Y"}, // y = 30
        {30, "A"}, // a = 30
        {28, "Z"}, // z = 28
    };
 
    // сортировка
    sort(begin(vecNUMBER), end(vecNUMBER), Greater);
 
    // вывод результата сортировки
    for (const auto& i : vecNUMBER)
    {
        cout << "\t" << i.value << ", " << i.title << endl;
    }
    cout << endl;
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2021, 13:47
Ответы с готовыми решениями:

Функциональный объект greater
Здравствуйте! Написал программу, но не могу выполнить условие задания с использование...

Функциональный объект и подсчёт определённых значений в векторе
Необходимо реализовать подсчёт количества элементов вектора, больших некоторого значения (вводится...

Как в бинарном предикате или функторе к одной из переменных применить некоторый функциональный объект?
Собственно назрел такой вопрос: Как в бинарном предикате или функторе к одной из переменных...

функциональный класс
Не могли бы вы привести пример функционального класса, для сортировки мультимножества, а именно по...

5
Модератор
Эксперт С++
13503 / 10755 / 6409
Регистрация: 18.12.2011
Сообщений: 28,704
08.10.2021, 14:48 2
Нужно всего лишь поменять
Цитата Сообщение от Anastasia_Galax Посмотреть сообщение
bool Greater(const NUMBER& a, const NUMBER& b)
на
C++
1
bool operator<(const NUMBER& a, const NUMBER& b)
и убрать Greater в вызове
C++
1
sort(begin(vecNUMBER), end(vecNUMBER));
0
0 / 0 / 0
Регистрация: 27.02.2021
Сообщений: 89
08.10.2021, 15:25  [ТС] 3
А если bool operator перенести в сам класс, ничего изменять не надо?

Добавлено через 1 минуту
Я сделала так, мне выдает ошибку, подскажите в чем дело
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <algorithm>
#include <iostream>
#include <string>
 
using namespace std;
 
// класс чисел
class NUMBER
{
public:
    NUMBER(int value, string title) {
        this->value = value;
        this->title = title;
    }
 
    int value;
    string title;
 
    bool operator()(const NUMBER& a, const NUMBER& b)
    {
        if (a.value == b.value) // если значения равны
        {
            return a.title < b.title; // то первое числа меньше второго
        }
 
        return a.value > b.value; // иначе первое больше второго числа
    }
};
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "==================================================" << endl;
    cout << "> Имеется четыре(4) числа: x=24, y=30, a=30, z=28. " << '\n';
    cout << endl;
    cout << "> Отсортируем числа от большего к меньшему, " << endl << "если они равны, то сортируем за алфавитом." << endl;
    cout << "==================================================" << endl;
    cout << endl;
    cout << "> Результат:" << endl;
    cout << endl;
 
    NUMBER vecNUMBER[] // массив чисел
    {
        {24, "X"}, // х = 24
        {30, "Y"}, // y = 30
        {30, "A"}, // a = 30
        {28, "Z"}, // z = 28
    };
 
    // сортировка
    sort(begin(vecNUMBER), end(vecNUMBER));
 
    // вывод результата сортировки
    for (const auto& i : vecNUMBER)
    {
        cout << "\t" << i.value << ", " << i.title << endl;
    }
    cout << endl;
 
    system("pause");
    return 0;
}
0
2524 / 1244 / 459
Регистрация: 08.11.2016
Сообщений: 3,418
08.10.2021, 15:46 4
Anastasia_Galax, Вам показали что нужно перегружать оператор "меньше", а Вы перегружаете оператор "скобки". Если правильно определить оператор при определении его как член класса, то он должен принимать 1 параметр, поскольку вторым будет сам экземпляр класса передаваемый в функцию-член неявно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* член класса */
class Foo
{
    int a;
public:
    bool operator<(const Foo &other) { return this->a < other.a; }
};
 
/*не член класса*/
class Foo2
{
    int a;
public:
    int val(void) { return a; }
};
 
bool operator<(const Foo2 &a, const Foo2 &b)
{
    return a.val() < b.val();
}
если для функции не члена хотите доступ к закрытым членам класса без геттеров, то объявляйте как дружественную
C++
1
2
3
4
5
6
class Foo3
{
    int a;
public:
    friend bool operator<(const Foo3 &a, const Foo3 &b) { return a.a < b.a; }
};
0
0 / 0 / 0
Регистрация: 27.02.2021
Сообщений: 89
15.10.2021, 22:33  [ТС] 5
Дело в том, что нам сказали перегружать именно "скобки" operator()
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
15.10.2021, 23:12 6
Цитата Сообщение от Anastasia_Galax Посмотреть сообщение
Дело в том, что нам сказали перегружать именно "скобки" operator()
Странно, что до сих пор в ответах не сообразили, о чем идет речь. Вам нужно написать класс-компаратор, вместо функции-компаратора

C++
1
2
3
4
5
6
7
8
class Greater
{
public:
  bool operator()(const NUMBER& a, const NUMBER& b) const
  {
    return a.value != b.value ? a.value > b.value : a.title < b.title;
  }
};
и далее использовать его как

C++
1
sort(begin(vecNUMBER), end(vecNUMBER), Greater());
0
15.10.2021, 23:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2021, 23:12
Помогаю со студенческими работами здесь

Функциональный тип через typedef
Приветствую, нужна помощь в решении задачи: В файле заданы строки из 5-ти чисел: границы...

Указатель на функцию и функциональный класс
Есть такой код, но он не компилируется. В коде я использую указатель на функцию &quot;Func&quot;, что я...

Не удаётся связать алгоритм for_each и функциональный обьект
1. Написать программу, в которой создаётся массив и заполняется случайными числами в заданном...

Может ли объект-член, или объект-элемент достучаться к содержащему его?
Предположим, class A { ... }; class B { .... A a; ... };

Зачем при перегрузке оператора >> в параметр включать ссылку на объект, а не сам объект?
Зачем в параметры функции включать ссылку на объект: istream &amp;operator&gt;&gt;(istream &amp;stream, myclass...

Интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary...

Основы: указатель на объект или объект, что выбрать?
Не до конца понимаю (или вообще не понимаю) когда лучше использовать указатель на объект, а когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru