Ukio_G
@Ukio_G
Незамысловатый юноша.

Как сделать разную реализацию одной и той же функции класса в C++?

Предположим у нас есть некая модель, и допустим мы хотели чтобы по клику срабатывало какое-либо событие. Примерно такой класс позволит нам обработать нажатие (реализацию опустим):
Class Model{
Model();

public:
void click();
}


Однако, определив эту функцию, мы не сможем заставить разные модели вести себя по разному.
Суть вопроса как раз заключается в том, чтобы для каждого экземпляра класса Model функция click () выполнялась по разному. А если ещё можно будет, переопределяя эту функцию, изменять количество и типы аргументов, то будет вообще хорошо. Всем заранее спасибо за ответы или предложения погуглить по ключевым словам (буду крайне признателен, если их озвучат)
  • Вопрос задан
  • 277 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Перенести пользовательскую функциональность в другое место — так называемый «слушатель».
using EvClick = void (*)();

Class Model{
public:
  void click() { if (fOnClick) fOnClick(); }
  void setOnClick(EvClick x) { fOnClick = x; }
private:
  EvClick fOnClick = nullptr;
}

Подобные слушатели есть в любой визуальной оконной библиотеке: VCL, Qt. В VCL так и есть, за исключением вписанных в синтаксис свойств. В Qt для этого используют сигналы-слоты.

Наладить передачу любых данных в эту функцию — шаблон «команда».
class ClickEvent {
public:
  int x, y;
  virtual ~ClickEvent();
}

using EvClick = void (*)(ClickEvent&);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Либо хранить указатель на функцию en.cppreference.com/w/cpp/utility/functional/function (ну или сырой), либо сделать в базовом функцию виртуальной, а можно и то и другое, например так.

class Base {
public:
  virtual ~Base() {}
  virtual doIt()
  {
    if (callback)
      callback();
  }
private:
  std::function<void()> callback;

И в наследуемом можно будет переопределить doIt и он будет делать что-то другое.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы