Как функция может попросить свой класс вызывающей стороны вызвать один из своих методов? - PullRequest
0 голосов
/ 31 марта 2020

Я нахожусь в такой ситуации:

class Callee {
public:
  void request();
};

class Caller {
  void call() {
    Callee{}.request();
  }
  void invoke1(); // the implementation doesn't matter
  void invoke2(); // the implementation doesn't matter
  // more invoke()s
};

Я хочу Callee::request() запросить вызов одной из Caller::invoke() функций-членов в зависимости от контекста, который может быть вычислен либо в Callee::request() или Caller::call():

void Callee::request() {
  // do stuff
  switch (context) {
    // request one of the invoke()s to be run immediately
  }
  // do more stuff
}

Какие решения будут элегантными? Я не хочу (от самого важного до наименее важного):

  • Callee знать определение Caller;
  • использовать шаблоны;
  • Callee знать объявление Caller;
  • Caller для выбора invoke() самостоятельно;

Это нормально, если Callee::request() получает некоторые аргументы от Caller.

1 Ответ

0 голосов
/ 31 марта 2020

Существует несколько способов достижения этого.

  • Самое простое - это Callee::request() вернуть значение enum, которое затем Caller делает switch вкл и вызывает соответствующую функцию. Это означает, что вызывающий и вызываемый абоненты должны оба знать это enum.

  • Другой способ, который также находится на прямой территории, хотя и немного более запутанный, состоит в том, чтобы передать одну функцию из вызывающий для вызываемого, который принимает это значение enum в качестве параметра, так что, вызывая эту функцию, вызываемый может указать вызывающему, что он хочет сделать. Снова вызывающий может switch на этом значении и вызвать либо invoke1() или invoke2(), либо что у вас есть.

  • Другой способ - определить интерфейс (класс, состоящий из только чистые виртуальные методы), которые содержат invoke1() и invoke2(), позволяют вызывающему объекту реализовывать этот интерфейс и передавать этот интерфейс себе вызываемому, чтобы вызывающий мог решить, какую функцию вызывать. В этом случае вызывающий и вызываемый абоненты должны оба знать об этом новом интерфейсе.

  • Другой способ - передать вызываемому два указателя на функции, чтобы вызываемый мог решить, какой из них звонить. Таким образом, вызываемому пользователю не нужно ничего знать, но он не очень хорошо масштабируется, потому что, что, если у вас есть 50 различных функций?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...