0

我处于这样的情况:

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()成员函数,具体取决于上下文,可以在 inCallee::request()或 in 中计算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
  • Callerinvoke()自行选择;

如果Callee::request()Caller.

4

1 回答 1

0

有多种方法可以实现这一目标。

  • 最直接的方法是Callee::request()返回一个 enum值,Caller然后执行一个switchon 并调用一个适当的函数。这意味着调用者和被调用者都必须知道这一点enum

  • 另一种直接的方式,虽然稍微复杂一些,是从调用者传递一个函数到被调用者,它接受该enum值作为参数,以便通过调用这个函数,被调用者可以向调用者指示它是什么想要完成。调用者可以再次使用switch该值并调用您拥有的invoke1()invoke2()或拥有的东西。

  • 另一种方法是定义一个接口(仅由纯虚方法组成的类),该接口包含invoke1()invoke2() 让调用者实现该接口,并将其自身的接口传递给被调用者,以便被调用者可以决定调用哪个函数。在这种情况下,调用者和被调用者都需要了解这个新接口。

  • 另一种方法是向被调用者传递两个指向函数的指针,以便被调用者决定调用哪一个。这样被调用者不需要知道任何东西,但它的扩展性不是很好,因为如果你有 50 个不同的函数怎么办?

于 2020-03-31T12:20:32.420 回答