static
プログラムにルートが1つしかなくRobot
、そのロボットのインスタンスが静的に利用可能でない限り、ルートは実行可能ではありません。
タスクにaを渡すRobot
ことは問題ないかもしれませんが、情報が多すぎて、ロボット以外のオブジェクトでのタスクの使用が禁止される可能性があります。
3番目の方法は、完了通知用のインターフェイスのようなクラスを作成し、で拡張してRobot
、タスクから呼び出すことです。残念ながら、C ++は、仮想継承領域にユーザーをプッシュすることによって、それを特に簡単にすることはできません。
POSIXスレッドライブラリで一般的なコールバックアプローチ(voidポインタとvoidポインタを受け取る関数ポインタを渡す)を採用することもできますが、それはC++っぽくはありません。
最後に、C ++ 11を使用している場合は、Boostなどの外部ライブラリを使用せずに、関数とそれが動作するオブジェクトの両方を1つのクロージャーでラップすることにより、問題に非常に優雅に対処できる無名関数があります。
3番目のアプローチの簡単な例を次に示します(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();
}