Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Массив ссылок на функцию объекта и выполнения этих функций  [new]
Андрей159
Member

Откуда:
Сообщений: 1660
Ардуино использует С++
Создал несколько разных классов и в некоторых классах есть void update()
Хотел бы в void loop() выполнять один метод, который бы выполнял в каждом объекте класса функцию update()

Сейчас это выглядит так:
TIMER timer1;
TIMER timer2;

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

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


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


компилятор выдает массу ошибок и не в какую не получается так сделать. А вообще это реально?
31 окт 20, 00:09    [22223821]     Ответить | Цитировать Сообщить модератору
 Re: Массив ссылок на функцию объекта и выполнения этих функций  [new]
Андрей159
Member

Откуда:
Сообщений: 1660
уточню, что есть разные классы и у большинства есть update
Например
TIMER, BUTTON, SWITCH, SENSOR...
31 окт 20, 00:12    [22223822]     Ответить | Цитировать Сообщить модератору
 Re: Массив ссылок на функцию объекта и выполнения этих функций  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Например так:
for (auto ptimer: {&timer1, &timer2}) {
  ptimer->update();
}
31 окт 20, 00:21    [22223823]     Ответить | Цитировать Сообщить модератору
 Re: Массив ссылок на функцию объекта и выполнения этих функций  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

Anatoly Moskovsky
Например так:

Это бы потребовало общего предка с виртуальным update(), нет?..

Posted via ActualForum NNTP Server 1.5

31 окт 20, 01:20    [22223832]     Ответить | Цитировать Сообщить модератору
 Re: Массив ссылок на функцию объекта и выполнения этих функций  [new]
Андрей159
Member

Откуда:
Сообщений: 1660
А каким образом можна при инициализации класса
добавить в массив ссылку на функцию update() класса?
Например
class TIMER{
    public:
        TIMER(){
            this->next_time = 0;
            this->timer_status = 0;
            БупбличныйМассив[МаксКство+1] = СсылкаНаUpdate
        }
   update(){
      //.....
  }

  //....


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

Я пробовал передавать ссылку на класс - ошибок нет. Как только пробовал ссылаться из ссылки на *(БупбличныйМассив[f])->update(); сразу копилятор ругается на ->update
31 окт 20, 09:54    [22223877]     Ответить | Цитировать Сообщить модератору
 Re: Массив ссылок на функцию объекта и выполнения этих функций  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Андрей159,

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

std::vector
?
https://ravesli.com/urok-151-kontejnernye-klassy/
31 окт 20, 10:50    [22223887]     Ответить | Цитировать Сообщить модератору
 Re: Массив ссылок на функцию объекта и выполнения этих функций  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Андрей159
которая не принадлежит никакому классу
не делайте без причин функции без классов и без пространства имен.
"каждый сын имеет родителя" ООП
31 окт 20, 10:52    [22223888]     Ответить | Цитировать Сообщить модератору
 Re: Массив ссылок на функцию объекта и выполнения этих функций  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
Андрей159
А каким образом можна при инициализации класса
добавить в массив ссылку на функцию update() класса?

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

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


#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;
}
31 окт 20, 11:40    [22223897]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить