除非您的程序中只有一个,并且该机器人的实例是静态可用的,否则该static
路线是不可行的。Robot
将 a 传递Robot
给任务可能没问题,但它可能会泄露太多信息并禁止任务与机器人以外的对象一起使用。
第三种选择是为完成通知创建一个类似接口的类,在 中扩展它Robot
,并从任务中调用它。不幸的是,C++ 并没有让你进入虚拟继承领域,这让你变得特别容易。
您可以采用 POSIX 线程库中常见的回调方法(传递 void 指针和采用 void 指针的函数指针),但这不是 C++ 风格。
最后,如果您使用的是 C++11,您可以使用匿名函数,通过将函数和在其上运行的对象包装在单个闭包中,无需使用外部库(例如 boost),即可非常优雅地解决问题。
这是第三种方法的快速示例(指向 ideone 的链接):
#include <iostream>
#include <string>
using namespace std;
class WithNotification {
public:
virtual void notify()=0;
};
class Robot : public virtual WithNotification {
private:
string name;
public:
Robot(const string& n) : name(n) {}
virtual void notify() {cout << name << " has been notified" << endl; }
};
class Task {
private:
WithNotification& onFinished;
public:
Task(WithNotification& f) : onFinished(f) {}
void run() {
cout << "The task is running" << endl;
onFinished.notify();
}
};
int main() {
Robot r1("Quick");
Robot r2("Brown");
Task t1(r1);
Task t2(r2);
t1.run();
t2.run();
}