【发布时间】:2020-03-18 16:21:56
【问题描述】:
在现有的源代码框架上,我试图让源代码在两个对象(例如 A 和 B)之间进行通信。
AFAIK,由于类型推断不完整,无法通过在每个对象中使用队列来传递消息。
例如(假设每个类定义在不同的头文件,A.h B.h),
A类:
B* b; // assume we have this declaration in class A
b->receiveMessageFromA(data); // object 'b' wants to receive a message from object 'a'
B 类:
A* a; // assume we have this declaration in class B
a->receiveMessageFromB(data); // object 'a' wants to receive a message from object 'b'
由于发生不完整的类型编译错误,即使我使用前向类声明也无法完成上述实现。
为了弥补这一点,我认为定义名为 MessageQueue 的类可以对此有所帮助。
现在,我想举一个简单的例子来定义类 A、B 和消息队列。
class Message { // Assume Request is defined somewhere
public:
std::vector<Request> messageFromA; // message q
std::vector<Request> messageFromB; // message q
}
class A {
public:
Message* msg;
void sendMsgToB(Request req) {
msg->messageFromA.push_back(req); // send message to B
}
void tick() {
if (msg->messageFromB().size() != 0) {
// if 'messageFromB' queue has elements, A can receive message from B
}
}
}
class B {
public:
Message* msg;
void sendMsgToA(Request req) {
msg->messageFromB.push_back(req);
}
void tick() {
if (msg->messageFromA.size() != 0) {
// if 'messageFromA' queue has elements, B can receive message from A
}
}
}
设计class Message 是不是在两个类之间进行通信的错误选择?
听说有监听器/观察者模式,但是可能需要在现有框架中修改大量源代码,污染原有的设计模式。
【问题讨论】:
-
我看到的消息的一般结构是一个数据字段的结构,称之为
Message.. 每个类在构造时都可以采用std::queue<Message>&。在创建A和B之前创建std::queue<Message>,然后将queue传递给每个类构造函数。如果这是单线程的,你就完成了。如果它是多线程的,请确保包含mutex。如果类需要跨机器或跨时间或两者进行通信,请在发送数据之前对其进行序列化。
标签: c++ design-patterns