私は次のクラスをセットアップしています(ここでは関連するコンテンツのみ):
// Message.h
class Message { };
typedef std::shared_ptr<Message> MessagePtr;
// Task.h
#include "Message.h"
/*
* On include of Communication.h compilation fails.
*/
class Task {
public:
send(const MessagePtr &msg) {
// Call to Communication::send
}
MessagePtr recv() {
// Call to Communication::recv
}
};
typedef std::shared_ptr<Task> TaskPtr;
// Base.h
#include "Task.h"
class Base {
std::map<TaskPtr, std::vector<TaskPtr>> taskMap;
};
// Runtime.h
#include "Base.h"
class Runtime : public Base { };
// Communication.h
#include "Base.h"
class Message; // Forward declaration
class Communication : public Base {
public:
void send(const TaskPtr &caller, const MessagePtr &msg);
MessagePtr recv(const TaskPtr &caller);
};
Communication
私の目標は、タスクが相互に通信できるようにするために、一種の独立した通信レイヤーを内部に提供することです。受信者リストはtaskMap
(送信者が受信者を知らない種類の発行-購読) 内で定義されます。
この目的のために、私の考えは、コールバック関数を使用することです(たとえば、std::bind
または同様のもの) from Task
to Communication
。ただし、循環インクルードが原因で、コンパイルにCommunication
ヘッダーを含めるたびに失敗するため、これを実装することはできません。Task
send
したがって、declare / recv
fromCommunication
を転送して 内で使用する方法がわかりませんTask
。私はこの質問を読んだことがCommunication
ありますTask
. のメンバーに一種の前方宣言を導入することが最善の解決策のように思えますがCommunication
、これを達成する方法がわからないのではないかと心配しています。
クラスの設定についても、目的に合っているかどうかについて考えましたが、まだより良い解決策は思いつきませんでした。