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

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

12.02.2022, 22:37. Показов 1960. Ответов 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 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
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
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
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
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
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
12923 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru