Как правильно создать класс

Доброго времени суток!
Подскажите, как правильно создать класс, чтобы можно было переопределить какой-либо метод в экземпляре класса и возможно ли такое?
Условно хочу сделать что-то такое

class LED{
  public:
    LED(byte pin, uint16_t prd) {
      _pin = pin;
      _prd = prd;
      pinMode(_pin, OUTPUT);
    }
    void blink() {
      //функция в классе, которая должна быть определена при создании экземпляра класса
    }
  private:
    byte _pin;
    uint16_t _prd;
};


#include "LED.h"
LED led1(13, 500);
LED led2(12, 1000);

void led1.blink() {
  // код функции для led1
}

void led2.blink() {
  // код функции для led2
}

соответственно при вызове led1.blink() и led2.blink() вызывается разный код.

это так не работает

class LED1 : public  LED
{
public
  void blink()
  {
     // здесь определяете свой код
  }
};

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

ну или по канонам создаешь общий класс, желательно абстрактный, с виртуальной функцией blink(). От него наследуешь два класса led1 и led2 и переопределяешь в них blink по-своему.

Примерно, как тут?

class Button {
   virtual void push() = 0;
}

class PowerButton : public Button {
   virtual void push() {
      shutdown();
   }
}

А вот в этом примере я не совсем понял

class Button {
   public:
      Button(const std::function<void()> &pushCallback) :
         mPushCallback(pushCallback) {}

      void push() { mPushCallback(); }
   private:
      const std::function<void()> mPushCallback;

//usage:

Button powerButton([]() {
   powerOff();
});

Что за хитрый синтаксис в конструкторе powerButton(

Здесь в качестве аргумента передается код

Вот эти скобки что передают?

Указывают, что это функция. При вызове powerButton будет выполнен код, заключенный между фигурными скобками. Только не припоминаю в C++ слова function. В JS такие конструкции используются, а в плюсах не встречал

В php это ключевое слово тоже используется.

Да, это пример не из си))

Но суть конструкции примерно понятна, в конструкторе передаем коллбэк ссылку. Осталось понять, как это в си описывается синкаксически.

override нада

1 лайк

Спасибо!

Заводишь тип указателя на функцию

using PFCallback = void(*)(void);   // pointer to function вида: void xxx(void);
// можешь даже кнопку передать, которая нажата
using PFCalbackButton = void(*)(const TButton &);  // pointer to function вида: void xxx(const TButton &);

передаёшь в конструктор

TButton::TButton(PFCallback MyOwnFunc);

Запоминаешь во внутренней переменной - члене. Вызываешь по мере надобности. Можешь даже туда лямбду запхать, чтоб не плодить функций

Примерно так

typedef void (*LedBlink)(void); // тип - указатель для Callback-функции

void blink1()
{}

class LED{
  public:
    LED(byte pin, uint16_t prd, LedBlink callback) {
      _pin = pin;
      _prd = prd;
      pinMode(_pin, OUTPUT);
      _callback = callback;
    }
    void blink() {
      _callback();
    }
  private:
    byte _pin;
    uint16_t _prd;
    LedBlink _callback = nullptr;
};

LED led1(13, 500, blink1);
1 лайк

Помнится, где-то я на этом обжегся, заменил на typedef ))

1 лайк

если правильно применять, не абажжошся. Хотя С++ состоит из огнедышащих демонов чуть более, чем полностью.

1 лайк

Во-во ))

Спасибо большое!
Все получилось и с наследованием классов и с передачей функции