【问题标题】:How can a function ask its caller class to invoke one of its methods?函数如何要求其调用者类调用其方法之一?
【发布时间】:2020-07-11 23:36:11
【问题描述】:

我的情况是这样的:

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 的一些参数就可以了。

【问题讨论】:

  • 将上下文传递给request
  • 如果所有调用函数都具有相同的签名,您可以将适当的std::function 对象传递给Callee::request
  • 您有相互矛盾的要求:如果 Callee 不知道 Caller 方法,它如何选择调用哪个方法?请澄清一下,您是否希望仅根据索引号或什么来进行调用?还是我误解了Callee可以选择的要求?
  • 没有什么好的方法可以满足您的所有要求。如果您不想使用模板,那么您可以使用 Caller 的抽象基类 Callee 类需要知道的。模板并将Caller 对象传递给request 函数对我来说似乎是最简单的解决方案。
  • 阿什瓦尼是正确的。您可以将[this](){this->invoke1();} 存储在std::function<void()> 中。如果您不认识表格,那是一个 lambda。它捕获this

标签: c++ function class member design-decisions


【解决方案1】:

您可以通过多种方式实现这一目标。

  • 最直接的方法是让Callee::request() 返回一个 enum 值,Caller 然后执行 switch 并调用 一个合适的功能。这意味着调用者和被调用者将拥有 都知道这个enum

  • 另一种方式也很简单,不过 稍微复杂一点,就是从 被调用者的调用者,它接受 enum 值作为参数, 这样通过调用此函数,被调用者可以向调用者指示 它想要做什么。再次调用者可以switch 对该值和 调用 invoke1()invoke2() 或你有什么。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2020-07-29
    • 2021-08-14
    相关资源
    最近更新 更多