С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247

Использование абстрактного функтора

12.02.2022, 22:37. Показов 1965. Ответов 28

Студворк — интернет-сервис помощи студентам
Здравствуйте. Задумал перегрузить в абстрактном классе 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
#include <iostream>
#include <memory>
#include <array>
 
class Abstract
{
public:
    virtual void operator()() = 0;
};
 
class FirstClass : public Abstract
{
    void operator()() { std::cout << 0; };
};
 
class SecondClass : public Abstract
{
    void operator()() { std::cout << 1; };
};
 
int main()
{
    using std::unique_ptr;
    using std::make_unique;
    using std::array;
 
    array<unique_ptr<Abstract>, 2> obj{
        make_unique<FirstClass>(), make_unique<SecondClass>() };
 
    obj[1]->operator()(); //Работает как надо, на выглядит ужасно
 
    //obj[0](); //Было бы неплохо как-то так (или obj()[0], мы ведь ищем по индексу именно функтор)
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.02.2022, 22:37
Ответы с готовыми решениями:

Использование собственного функтора со связывателями
Не могу правильно написать функтор, чтобы его можно было использовать с биндом. Вот пример на сравнение строк без учета регистра: ...

Использование функтора в параллельных вычислениях
Имеется функтор, которых производит преобразование в потоках над элементами контейнера, например вектора. Очевидно, что использование...

Использование абстрактного класса
Доброго времени. Использую абстрактный класс Algorithm с абстрактным методом Calculate() и 5 производных от него классов, реализующих тот...

28
2393 / 1914 / 763
Регистрация: 27.07.2012
Сообщений: 5,558
12.02.2022, 22:51
Лучший ответ Сообщение было отмечено Rhoxolan как решение

Решение

obj[0] надо разыменовать, так как это указатель: (*obj[0])();
1
Заблокирован
12.02.2022, 22:58
Попахивает кривим проектированием ...
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.02.2022, 23:03
Rhoxolan, используйте NVI.

Добавлено через 41 секунду
https://en.wikipedia.org/wiki/... ce_pattern
1
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
12.02.2022, 23:06  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
obj[0] надо разыменовать, так как это указатель: (*obj[0])();
Спасибо!

Цитата Сообщение от SmallEvil Посмотреть сообщение
Попахивает кривим проектированием ...
Проектирование экспериментальное.

Цитата Сообщение от DrOffset Посмотреть сообщение
Rhoxolan, используйте NVI.
Спасибо.
0
Заблокирован
12.02.2022, 23:29
Цитата Сообщение от DrOffset Посмотреть сообщение
используйте NVI.
Вот не знаю, но по ощущению это NVI тоже кривой дизайн.
Не помню сейчас где такое видел, но на практике это полный кошмар.
Когда поведение твоего класса/методов полностью контролирует какая-то обвязка ....
Может я просто старомоден ....

Добавлено через 48 секунд
Цитата Сообщение от SmallEvil Посмотреть сообщение
Когда поведение твоего класса/методов полностью контролирует какая-то обвязка
И в итоге желаемого поведения , вполне законного по правилам фреймворка/иерархии, очень сложно добиться.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.02.2022, 23:32
SmallEvil, вообще мое сообщение про NVI как раз было к комментарию про кривой дизайн. Это способ этот дизайн улучшить.

Дальше же "кривость" обсуждать нет смысла, пока не станет известна задача.
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
12.02.2022, 23:35  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Дальше же "кривость" обсуждать нет смысла, пока не станет известна задача.
Задача - три варианта реализации меню, в зависимости от ситуации. Функтор, собственно, и предполагается как меню (ещё раз подчеркну, идеи экспериментальные).
0
Заблокирован
13.02.2022, 00:04
Цитата Сообщение от Rhoxolan Посмотреть сообщение
Задача - три варианта реализации меню, в зависимости от ситуации. Функтор, собственно, и предполагается как меню
И при чем здесь абстрагирование функторов ?
У функторов лишь одна задача - выполняться.
У пункта меню, их больше. Не говоря уже про само меню.
Цитата Сообщение от Rhoxolan Посмотреть сообщение
Функтор, собственно, и предполагается как меню
Ну вот и воть, вы пытаетесь надать низкуровневой сущности / объекту высоких целей.
Таки я был прав, плохое проектирование ведет к ненужным/избыточным реализациям.

Вспомнился подход к проектированию рассмотренный в книге Страуструпа по с++ :
Взаимосвязный подход к проектированию, в котором разные этапы чередуются(и обращаются друг к другу) по мере необходимости.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
13.02.2022, 00:52
Цитата Сообщение от Rhoxolan Посмотреть сообщение
Получилось, работает как надо, но выглядит ужасно, совершенно не так, как задумывалось.
Что именно "выглядит ужасно"? В чем именно проблема? Как задумывалось?
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
13.02.2022, 00:54
Цитата Сообщение от SmallEvil Посмотреть сообщение
У функторов лишь одна задача - выполняться.
У пункта меню, их больше.
Так фундаментально-то он в чём не прав? В том, что назвал класс-элемент меню функтором, а не каким-нибудь action'ом?

Типа вот есть такая шняга:
https://doc.qt.io/qt-5/qmenu.html#addAction-4
Тут кривой дизайн, или что?

Цитата Сообщение от SmallEvil Посмотреть сообщение
плохое проектирование ведет к ненужным/избыточным реализациям.
Как сделать, чтобы было всё нужное?
0
Заблокирован
13.02.2022, 01:01
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что именно "выглядит ужасно"? В чем именно проблема?
Цитата Сообщение от Rhoxolan Посмотреть сообщение
obj[1]->operator()(); //Работает как надо, на выглядит ужасно
...

Добавлено через 5 минут
Цитата Сообщение от ablex Посмотреть сообщение
В том, что назвал класс-элемент меню функтором, а не каким-нибудь action'ом?
Он назвал функтором всю сущность "меню".
И да, в программировании, функтор, имеет вполне определенное значение.

Цитата Сообщение от ablex Посмотреть сообщение
Как сделать, чтобы было всё нужное?
Не выдумывать ничего лишнего. Ваш, Капитан Очевидность (С)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
13.02.2022, 01:01
Цитата Сообщение от SmallEvil Посмотреть сообщение
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что именно "выглядит ужасно"? В чем именно проблема?
Цитата Сообщение от Rhoxolan Посмотреть сообщение
obj[1]->operator()(); //Работает как надо, на выглядит ужасно
...
Нет, ситнаксис вызова однаков для всех функторов. То есть эта "проблема" имеет место для любых функторов. Если бы проблема была именно в этом, то зачем бы нам ТС рассказывал истории про "использование абстрактного функтора" и про "задумал перегрузить в абстрактном классе operator(), что-бы создать абстрактный (или интерфейсный) функтор".

Очевидно, ТС ведет речь о чем-то другом.
0
13.02.2022, 01:06

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Очевидно, ТС ведет речь о чем-то другом.
Очевидность такого умозаключения для меня не очевидна )
Мои экстрасенсорные способности вполне ограничены.

0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
13.02.2022, 01:14
Цитата Сообщение от SmallEvil Посмотреть сообщение
Он назвал функтором всю сущность "меню".
Да, этот вопрос я прошляпил. Действительно, три варианта меню человек хочет в виде функторов. Впрочем и тут было бы желание, можно разрулить: если одно меню может быть подменю другого, то ничего страшного в таком решнии нет. Однако сомнительно, что ТС хотел именно этого.

Цитата Сообщение от SmallEvil Посмотреть сообщение
И да, в программировании, функтор, имеет вполне определенное значение.
Действительно вполне определённое - это функциональный объект. Что именно он будет делать - зависит от сферы применения.

Но меня лично смутило твоё первоначальное предположение, когда еще ничего этого не было известно. Если допустить, что я понял правильно, и автор хотел асбтрагировать пункты меню, чтобы объединить их в один массив - в чем кривость?

Цитата Сообщение от SmallEvil Посмотреть сообщение
Не выдумывать ничего лишнего. Ваш, Капитан Очевидность (С)
Не паясничай. Когда тебя на техническом форуме спрашивают, как решить конкретную задачу, то её решение и будет иметь ценность, а не твои отсылки к очевидности.
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
13.02.2022, 01:22  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
И при чем здесь абстрагирование функторов ?
У функторов лишь одна задача - выполняться.
У пункта меню, их больше. Не говоря уже про само меню.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Он назвал функтором всю сущность "меню".
И да, в программировании, функтор, имеет вполне определенное значение.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, ситнаксис вызова однаков для всех функторов. То есть эта "проблема" имеет место для любых функторов. Если бы проблема была именно в этом, то зачем бы нам ТС рассказывал истории про "использование абстрактного функтора" и про "задумал перегрузить в абстрактном классе operator(), что-бы создать абстрактный (или интерфейсный) функтор".
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Очевидно, ТС ведет речь о чем-то другом.
В понятие функтора я вкладываю значение функционального объекта. Иными словами, я хочу использовать объект абстрактного класса как меню, при этом передав ему в аргументах все необходимые параметры, скорее всего, уже с функции main.

Добавлено через 6 минут
Стоит добавить, что эту же задачу могу решить и не через operator()(&param1, &param2), а элементарно через void Menu(&param1, &param2). Об этом и писал, что в качестве эксперимента решил попробовать вышеизложенный подход.

Добавлено через 1 минуту
Может, у кого-то есть более общепринятые идеи реализации моей задумки?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
13.02.2022, 01:24
Цитата Сообщение от Rhoxolan Посмотреть сообщение
В понятие функтора я вкладываю значение функционального объекта. Иными словами, я хочу использовать объект абстрактного класса как меню, при этом передав ему в аргументах все необходимые параметры, скорее всего, уже с функции main.
Это прекрасно. Так в чем вопрос? Что именно "выглядит ужасно"? В чем именно проблема?
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
13.02.2022, 01:29  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это прекрасно. Так в чем вопрос? Что именно "выглядит ужасно"? В чем именно проблема?
"Выглядит ужасно" именно " obj[1]->operator()() ". В комментариях в моём коде я более подробно изложил суть проблемы и отметил, как бы хотел это все видеть.

Собственно, John Prick нашел решение моего вопроса, о чем и свидетельствует соответствующая пометка о решении.
0
Заблокирован
13.02.2022, 01:29
Цитата Сообщение от Rhoxolan Посмотреть сообщение
я хочу использовать объект абстрактного класса как меню
не бывает объектов абстрактного класса

Цитата Сообщение от Rhoxolan Посмотреть сообщение
В понятие функтора я вкладываю значение функционального объекта. Иными словами, я хочу использовать объект абстрактного класса как меню, при этом передав ему в аргументах все необходимые параметры, скорее всего, уже с функции main.
В понятие функтора я вкладываю значение функционального объекта.
- славно

я хочу использовать объект абстрактного класса как меню
- не славно, может не как меню, а как пункт меню ? Хотя и тут структурная проблма, пункт меню может содержать функтор, напротив, функтор содержащий пункт меню , выглядит дико и неудобно.

при этом передав ему в аргументах все необходимые параметры, скорее всего, уже с функции main.
-опять не славно, добавления пункта меню должно осущевствляться через само меню, кем это будет делаться, main или AI уже без разницы.

С функторами то какие вопросы.
Или что тогда должно делать "меню" при
C++
1
2
3
Menu menu;
// настройка элементов меню
menu(); // <--- ???
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
13.02.2022, 01:30  [ТС]
P.S - выдержка с моего же кода, к вопросу TheCalligrapher

C++
1
2
3
obj[1]->operator()(); //Работает как надо, на выглядит ужасно
 
//obj[0](); //Было бы неплохо как-то так (или obj()[0], мы ведь ищем по индексу именно функтор)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2022, 01:30
Помогаю со студенческими работами здесь

Использование абстрактного класса
Добрый день, Я использую библиотеку для визуализации QWT. У меня есть два вектора: вектор x, и вектор y. Мои данные представлены...

Использование конструктора абстрактного класса
Добрый вечер. Подскажите, как вызвать конструктор абстрактного класса из производного класса? Пытаюсь вызвать так: Advertising*...

Не допускается использование абстрактного типа класса
class Comparator { public: virtual bool operator()(Banner* lh, Banner* rh) const = 0; virtual bool met(Banner *obj) const = 0; ...

Назначение функтора
Приветствую всех. Объясните, пожалуйста, в чем выгода в использовании функтора в отличие от использования функции объекта? Код с хабра: ...

Отличие функтора от функции
в чём собственно отличие? имеется виду std::sort


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru