函数如何要求其调用者 class 调用其方法之一?
How can a function ask its caller class to invoke one of its methods?
我的情况是这样的:
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()
根据可以在 Callee::request()
或 Caller::call()
中计算的上下文请求调用 Caller::invoke()
成员函数之一:
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
收到一些参数就可以了。
您可以通过多种方式实现这一目标。
最直接的就是Callee::request()
return一个
enum
值,Caller
然后对其执行 switch
并调用
适当的功能。这意味着呼叫者和被呼叫者将有
都知道这个 enum
.
另一种方式也很简单,不过
稍微复杂一点,就是从
被调用者的调用者接受 enum
值作为参数,
这样通过调用此函数,被调用方可以向调用方指示
它想要做什么。同样,调用者可以 switch
该值,并且
调用 invoke1()
或 invoke2()
或者你有什么。
另一种方法是定义一个接口,(一个class只包含
纯虚方法),其中包含 invoke1()
和 invoke2()
让调用者实现该接口,并传递该接口
本身给被调用者,以便被调用者可以决定哪个函数
称呼。在这种情况下,呼叫者和被呼叫者都需要拥有
了解这个新界面。
另一种方法是将两个函数指针传递给被调用者,这样
被叫方可以决定调用哪一个。被调用者这样
不需要知道任何东西,但它的扩展性不是很好,因为
如果你有 50 个不同的函数怎么办?
我的情况是这样的:
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()
根据可以在 Callee::request()
或 Caller::call()
中计算的上下文请求调用 Caller::invoke()
成员函数之一:
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
收到一些参数就可以了。
您可以通过多种方式实现这一目标。
最直接的就是
Callee::request()
return一个enum
值,Caller
然后对其执行switch
并调用 适当的功能。这意味着呼叫者和被呼叫者将有 都知道这个enum
.另一种方式也很简单,不过 稍微复杂一点,就是从 被调用者的调用者接受
enum
值作为参数, 这样通过调用此函数,被调用方可以向调用方指示 它想要做什么。同样,调用者可以switch
该值,并且 调用invoke1()
或invoke2()
或者你有什么。另一种方法是定义一个接口,(一个class只包含 纯虚方法),其中包含
invoke1()
和invoke2()
让调用者实现该接口,并传递该接口 本身给被调用者,以便被调用者可以决定哪个函数 称呼。在这种情况下,呼叫者和被呼叫者都需要拥有 了解这个新界面。另一种方法是将两个函数指针传递给被调用者,这样 被叫方可以决定调用哪一个。被调用者这样 不需要知道任何东西,但它的扩展性不是很好,因为 如果你有 50 个不同的函数怎么办?