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

Как обращаться к элементам вектора, если они указатели на функторы

24.09.2020, 14:51. Показов 520. Ответов 6

Author24 — интернет-сервис помощи студентам
В классе создается вектор указателей на функторы.
Покажите, как использовать созданный вектор указателей на функторы из функции этого класса.

Создаем класс:
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
class MyClass
{
    struct MyClassParameters
    {
        unsigned int ddddddd;
        unsigned int rrrrrrr;
        unsigned int zzzzzzz;
 
    } MyClass_Sett;
 
    int func(CShortVec& input1, CDoubleArr& output1);    // в этой функции нужно использовать вектор указателей на функторы
 
    // Создаем функтор
    struct GetData
    {
        int operator()(CShortVec& input1, CDoubleArr& output1, MyClass & obj) 
        {
            if ( obj.MyClass_Sett.ddddddd < 0) return 0;    
            for (unsigned int i = 0; i < copyData.size(); i++) output1[i] = input1[i];
            return 0;
        }
    };
    std::vector<GetData*> copyData;  // Объявляем вектор указателей на функторы
}
Потом в конструкторе инициализирую вектор указателей на функторы:
C++ Скопировано
1
2
3
4
5
MyClass::MyClass()
{
    copyData.resize(10);
    for (unsigned int i = 0; i < copyData.size(); i++) copyData[i] = new GetData;
}

int MyClass::func(CShortVec& input1, CDoubleArr& output1)
{

for (unsigned int i = 0; i < copyData.size(); i++) copySamples[0]-> // Как использовать вектор указателей на функторы
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2020, 14:51
Ответы с готовыми решениями:

Как обращаться к Checkbox, если они вызываются программно?
Доброго времени суток. Уже который день не могу разобраться с программой. Дело вот в чем: На форму я вывела два компонента OptionButton, и...

Найти минимальный элемент массива (через указатели, запрещено обращаться к элементам массива по индексам)
Написать программу, создающую массив из 10 случайных целых чисел из отрезка . Вывести на экран весь массив и на ...

UpdatePanel. Как обращаться к элементам?
Добрый день. Слажилась такая ситуация: есть GridView. помимо этого на форме есть еще 2 текстбокса и кнопка. По нажатию на конопку данные с...

6
27 / 21 / 9
Регистрация: 26.01.2013
Сообщений: 168
24.09.2020, 15:10 2
Ну например
C++ Скопировано
1
for (unsigned int i = 0; i < copyData.size(); i++) copyData[0]->operator()(input1, output1, this)
Добавлено через 6 минут
Либо
C++ Скопировано
1
for (unsigned int i = 0; i < copyData.size(); i++) (*copyData[0])(input1, output1, this);
0
329 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,429
24.09.2020, 16:18 3
Цитата Сообщение от prokino Посмотреть сообщение
вектор указателей на функторы. Покажите, как использовать созданный вектор указателей на функторы из функции этого класса.
вариант - можно ведь просто передать список аргументов (указатели на функторы) в параметры функции - необязательно паковать в структуру... см. функции с переменным количеством параметров... кодом пока не приложу - сама только изучаю язык... - на правах предположения... ?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.09.2020, 19:24 4
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <vector>
#include <map>
#include <memory>
using namespace std;
struct operation
{
    virtual double operator()(const double &a, const double &b)const=0;
    virtual ~operation(){}
};
 
struct op_plus : operation
{
    double operator()(const double &a, const double &b)const override
    {
        return a+b ;
    }
 
 
};
 
struct op_minus : operation
{
     double operator()(const double &a, const double &b)const override
    {
        return a-b ;
    }
};
 
struct op_mult : operation
{
     double operator()(const double &a, const double &b)const override
    {
        return a*b ;
    }
};
 
 
struct op_div : operation
{
     double operator()(const double &a, const double &b)const override
    {
        double d= b>0? b:-b;
        if(d<10e-12)throw("div_by_zero!");
        return a/b ;
    }
};
 
 
 
vector<unique_ptr<operation>> vop;
 
double foo(const double &a, const double &b, const char c_op)
{
    double res;
    switch(c_op)
    {
         case '+' :res=(*vop[0])(a,b);break;
         case '-' :res=(*vop[1])(a,b);break;
         case '*' :res=(*vop[2])(a,b);break;
         case '/' :res=(*vop[3])(a,b);break;
         default :throw("bad symbol");
    }
    return res;
}
 
int main()
{
        vop.emplace_back(new op_plus);
        vop.emplace_back(new op_minus);
        vop.emplace_back(new op_mult);
        vop.emplace_back(new op_div);
 
     char what_to_do='n';
 
     while(true)
     {
         cout<<"Enter operation \"+-*//\", please ";
         cin>>what_to_do;
         if(what_to_do=='+'||
           what_to_do=='-'||
           what_to_do=='*'||
           what_to_do=='/')
           {
               double a,b,c;
                cout<<"\nEnter the first number, please ";
                cin>>a;
                cout<<"\nEnter the second number, please ";
                cin>>b;
                cout<<foo(a,b,what_to_do)<<endl;
 
           }else {
           cout<<"\nbye!\n";
           break;
           }
     }
 
map<char,unique_ptr<operation>> mop;
mop['+']=unique_ptr<operation>(new op_plus);
mop['-']=unique_ptr<operation>(new op_minus);
mop['*']=unique_ptr<operation>(new op_mult);
mop['/']=unique_ptr<operation>(new op_div);
 
while(true)
     {
         cout<<"Enter operation \"+-*//\", please ";
         cin>>what_to_do;
         if(what_to_do=='+'||
           what_to_do=='-'||
           what_to_do=='*'||
           what_to_do=='/')
           {
               double a,b,c;
                cout<<"\nEnter the first number, please ";
                cin>>a;
                cout<<"\nEnter the second number, please ";
                cin>>b;
                cout<<(*mop[what_to_do])(a,b)<<endl;
 
           }else {
           cout<<"\nbye!\n";
           break;
           }
     }
 
return 0;
}
мапа бывает лучше вектора.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12860 / 6725 / 1807
Регистрация: 18.10.2014
Сообщений: 17,025
24.09.2020, 19:53 5
Цитата Сообщение от prokino Посмотреть сообщение
copySamples[0]-> // Как использовать вектор указателей на функторы
C++ Скопировано
1
(*copySamples[0])(...параметры...)
Только не ясно, что такое copySamples и почему именно [0].
0
329 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,429
30.09.2020, 07:11 6
Цитата Сообщение от IGPIGP Посмотреть сообщение
мапа бывает лучше вектора.
кстати видела ещё один простенький пример map функций... не дорабатываю до тз ветки (надо переделать на использование указателей на функции-члены класса, вместо просто вызова самих функций)... оставлю для визуализации удобства map:
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
 // https://stackoverflow.com/questions/35331742/c-function-map
 // C++ Function Map
 
 #include <iostream>
#include <functional>
#include <algorithm>
#include <map>
 
typedef std::function<void()> func_t;
typedef std::map<std::string, func_t> func_t_map;
 
void disp1()
{
    std::cout<<"\n Display 1 "<<std::endl;
    return;
}
 
 
void disp2()
{
    std::cout<<"\n Display 2 "<<std::endl;
    return;
}
 
void disp3()
{
    std::cout<<"\n Display 3 "<<std::endl;
    return;
}
 
void disp4()
{
    std::cout<<"\n Display 4 "<<std::endl;
    return;
}
 
 
 
int main()
{
    func_t_map fMap;
 
 
    fMap["d1"] = disp1;
    fMap["d2"] = disp2;
    fMap["d3"] = disp3;
    fMap["d4"] = disp4;
 
    fMap["d3"]();
 
    return 0;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.09.2020, 11:15 7
Цитата Сообщение от JeyCi Посмотреть сообщение
кстати видела ещё один простенький пример map функций... не дорабатываю до тз ветки (надо переделать на использование указателей на функции-члены класса, вместо просто вызова самих функций)... оставлю для визуализации удобства map:
JeyCi, составить карту указателей на методы не сложно. Но речь в теме ведь шла о объектах хранящих состояние:
Цитата Сообщение от prokino Посмотреть сообщение
В классе создается вектор указателей на функторы.
Хотите, я в своём примере с полиморфным функтором, добавлю наследника с десятком параметров, которые не помешают поместить такой объект в контейнер указателей? А карта с указателями на функции требует определённых сигнатур. Указатель кстати - уникальный адрес и может быть ключом. Это иногда удобно для создания множеств, карт и пр. Но в теме речь была о вызываемых объектах типа функтор.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.09.2020, 11:15
Помогаю со студенческими работами здесь

Как обращаться к элементам окна ?
Помогите пожалуйста ! Создается окно JFrame. Как обращаться к элементам формы ??? Допустим открываю обработчик событий кнопки и хочу по...

Как в процедуре обращаться к элементам формы?
Добрый день. Пишу программу, и что б не писать 1 и тоже кучу раз, решил создать процедуру, и если написать в ней, например a:=1 то все...

Как обращаться к определённым элементам Listbox
Вообщем передо мной стоит задача: Выдать названия всех пьес, которые поставлены в театре с заданным названием, я сделал Лист бокс в котором...

Как обращаться к элементам двумерного массива?
У меня та же ошибка в программе #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #define N 4 #define M 3 void main...

Как обращаться к элементам массива структур
Допустим, что у меня есть структура default, имеющая под собой некоторое количество элементов типа char по имени number, и есть ссылка на...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Контейнеризация ML моделей с помощью Docker и Kubernetes
Mr. Docker 14.03.2025
Перенос ML-моделей из лаборатории в продакшн сопровождается целым комплексом проблем. Нередко код, который отлично работает на локальной машине, отказывается функционировать в промышленной среде. . . .
Организация масштабируемого хранилища с Apache Cassandra
Codd 14.03.2025
Изначально разработанная в Facebook, а затем переданная Apache Software Foundation, Cassandra сочетает в себе принципы Amazon's Dynamo и Google's BigTable. Эта комбинация создает уникальную. . .
Kafka или Pulsar: Что лучше для потоковой обработки в Java
Javaican 14.03.2025
Среди множества решений для потоковой обработки данных Apache Kafka долгое время удерживала лидирующие позиции, став де-факто стандартом в индустрии. Однако в последние годы всё больше внимания. . .
Создание и использование компонентов в Vue 3
Reangularity 14.03.2025
Компонент в Vue - это автономный блок интерфейса, который содержит собственную разметку, логику и стили. Представьте себе кнопку, форму ввода или даже целую панель навигации - всё это можно оформить. . .
Vue 3: Создаем современное веб-приложение с Composition API
Reangularity 14.03.2025
В фронтенд-разработке Vue 3 выделяется своим прагматичным подходом. В отличие от React с его минималистичной философией "всё — JavaScript" или Angular с его всеобъемлющим корпоративным подходом, Vue. . .
Разработка контекстных меню в iOS
mobDevWorks 14.03.2025
С приходом iOS 13 Apple представила новый API для контекстных меню, который полностью заменил предыдущую технологию 3D Touch peek & pop. Хотя многие разработчики и пользователи испытывают ностальгию. . .
Лучшие практики оптимизации Docker Image
Mr. Docker 13.03.2025
Размер Docker-образа влияет на множество аспектов работы с контейнерами. Чем больше образ, тем дольше его загрузка в реестр и выгрузка из него. Для команд разработки, работающих с CI/ CD пайплайнами,. . .
Вопросы на собеседовании по Docker
Mr. Docker 13.03.2025
Ты сидишь напротив технического специалиста, и вдруг звучит вопрос про Docker Swarm или многоэтапные сборки. Пот на лбу? Не переживай, после этой статьи ты будешь готов ко всему! Эта статья будет. . .
Поиск текста в сносках : замена дефиса на тире или тире на дефис...
РоΜа 13.03.2025
Нужно было найти текст в сносках и заменить. Почему-то метод селекшн не сработал. . . пришлось гуглить. найденный на форумвба код пришлось править. Смысл - заменяет в сносках дефисы и тире на нужные. . . .
Real PATH definitions in bash scripts
jigi33 13.03.2025
Как поймать путь и путь к директории относительно запускаемого файла в BASH 1. поймать путь через вывод $(pwd) 2. более правильно - на основе realpath (см. скриншот)
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер