我有以下类设置(这里只与相关内容):C++成员回调与向前声明
// 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
(发送者不知道接收者的发布 - 订阅类型)内定义。
为此,我的想法是使用从Task
到Communication
的回调函数(例如std::bind
或类似的)。但是,我无法执行此操作,因为无论何时我将Communication
标头内的Task
编译失败,这是由于通告包含在内。
所以我不确定如何从Communication
转发声明send
/recv
在Task
内使用它们。我已阅读this问题,这是类似的,也提供了很好的答案,但我想避免在Task
内放置指向Communication
的指针。在我看来,最好的解决方案是为Communication
的成员引入一种前向声明,但是我担心我不知道如何实现这一点。
我也想过班级设置,无论是否符合目的,但没有提出更好的解决方案。
可您拆分代码分成单独的块所以很清楚哪些东西在头声明?也许一个评论显示你希望能够插入回调函数? – Oktalist
完成后,还添加了当前的include和关于包含编译失败的注释。 –
不错。现在'Task :: send()'和'recv()'从哪里获得'Communication'的实例?你真的在类定义中内联定义这些函数,还是在单独的'Task.cpp'文件中定义? (如果您可以简单回答这些问题,则无需编辑代码。) – Oktalist