Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массив ссылок на функцию объекта и выполнения этих функций / 8 сообщений из 8, страница 1 из 1
31.10.2020, 00:09
    #40013614
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок на функцию объекта и выполнения этих функций
Ардуино использует С++
Создал несколько разных классов и в некоторых классах есть void update()
Хотел бы в void loop() выполнять один метод, который бы выполнял в каждом объекте класса функцию update()

Сейчас это выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
TIMER timer1;
TIMER timer2;

void loop(){
  timer1.update();
  timer2.update();
  .. и таких может быть много

.. дальше алгоритм с условиями..



Почитал о ссылках и указателях, решил, что смогу объявить масив *void arrobj[20]; например
в масив думал, что буду помещать ссылку на функцию объекта или на объект(пробовал всякое)
потом в одной функции хотел в цикле пробежаться по массиву и вызвать эти же функции классов, чтоб упростить код в loop
Код: plaintext
1.
2.
3.
void loop(){
  update();
...



компилятор выдает массу ошибок и не в какую не получается так сделать. А вообще это реально?
...
Рейтинг: 0 / 0
31.10.2020, 00:12
    #40013615
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок на функцию объекта и выполнения этих функций
уточню, что есть разные классы и у большинства есть update
Например
TIMER, BUTTON, SWITCH, SENSOR...
...
Рейтинг: 0 / 0
31.10.2020, 00:21
    #40013616
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок на функцию объекта и выполнения этих функций
Например так:
Код: plaintext
1.
2.
3.
for (auto ptimer: {&timer1, &timer2}) {
  ptimer->update();
}
...
Рейтинг: 0 / 0
31.10.2020, 01:20
    #40013624
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок на функцию объекта и выполнения этих функций
Anatoly MoskovskyНапример так:

Это бы потребовало общего предка с виртуальным update(), нет?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.10.2020, 09:54
    #40013654
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок на функцию объекта и выполнения этих функций
А каким образом можна при инициализации класса
добавить в массив ссылку на функцию update() класса ?
Например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class TIMER{
    public:
        TIMER(){
            this->next_time = 0;
            this->timer_status = 0;
            БупбличныйМассив[МаксКство+1] = СсылкаНаUpdate
        }
   update(){
      //.....
  }

  //....



А уже в другой отдельной функции update() которая не принадлежит никакому классу
пробежаться по циклу БупбличныйМассив и вызвать эти все зарегистрированные функции по ссылке, которые находятся в массиве?

Я пробовал передавать ссылку на класс - ошибок нет. Как только пробовал ссылаться из ссылки на *(БупбличныйМассив[f])->update(); сразу копилятор ругается на ->update
...
Рейтинг: 0 / 0
31.10.2020, 10:50
    #40013659
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок на функцию объекта и выполнения этих функций
Андрей159,

Контейнерный класс (или «класс-контейнер») в языке C++ — это класс, предназначенный для хранения и организации нескольких объектов определенного типа данных (пользовательских или фундаментальных).

std::vector
?
https://ravesli.com/urok-151-kontejnernye-klassy/
...
Рейтинг: 0 / 0
31.10.2020, 10:52
    #40013660
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок на функцию объекта и выполнения этих функций
Андрей159
которая не принадлежит никакому классу
не делайте без причин функции без классов и без пространства имен.
"каждый сын имеет родителя" ООП
...
Рейтинг: 0 / 0
31.10.2020, 11:40
    #40013666
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив ссылок на функцию объекта и выполнения этих функций
Андрей159
А каким образом можна при инициализации класса
добавить в массив ссылку на функцию update() класса ?

А уже в другой отдельной функции update() которая не принадлежит никакому классу
пробежаться по циклу БупбличныйМассив и вызвать эти все зарегистрированные функции по ссылке, которые находятся в массиве?

Я пробовал передавать ссылку на класс - ошибок нет. Как только пробовал ссылаться из ссылки на *(БупбличныйМассив[f])->update(); сразу копилятор ругается на ->update


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <vector>
#include <functional>

struct Timer {
    Timer(std::vector<std::function<void()>>& updaters)
    {
        updaters.emplace_back([this](){ update(); });
    }
    void update()
    {

    }
};

int main()
{
    std::vector<std::function<void()>> updaters;
    Timer timer1{updaters}, timer2{updaters};
    for (auto& update: updaters) {
        update();
    }
    return 0;
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массив ссылок на функцию объекта и выполнения этих функций / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]