gpt4 book ai didi

c++ - 请求-响应系统

转载 作者:行者123 更新时间:2023-11-30 04:25:14 25 4
gpt4 key购买 nike

我有请求对象和相应的响应对象。发件人对象发出请求,然后监听响应。一个发送者/听众对象可以发送不同的请求。每个请求进入一个全局队列,在处理后,相应的响应被发送到每个监听器对象。

最佳答案

您的问题有多种解决方案。一种是,收发器通知所有 Request反对它的破坏。为此,你需要一个像 Transceiver::addRequest()哪个Request对象用来注册自己。在里面Transceiver 的析构函数你必须通知所有注册Request的。例如:

class Transceiver
{
virtual ~Transceiver()
{
for (auto request : m_requests)
request->deleteTransceiver(this);
}

void addRequest(Request* r)
{
m_requests.push_back(r);
}

void removeRequest(Request* r)
{
m_requests.erase(std::remove(m_requests.begin(), m_requests.end(), r),
m_requests.end());
}

std::vector<Request*> m_requests;
};

class Request
{
virtual void deleteTransceiver(Transceiver* t) = 0;
virtual void notify() = 0;
};

class RequestImpl : public Request
{
RequestImpl(Transceiver* t)
: m_target(t)
{
if (t)
t->addRequest(this);
}

~RequestImpl()
{
if (m_target)
m_target->removeRequest(this);
}

virtual void deleteTransceiver(Transceiver* t)
{
if (m_target == t)
m_target = 0;
}

virtual void notify()
{
if (m_target)
m_target->process(ResponseType());
}

Transceiver* m_target;
};

第二种方法当然是防止破坏 Transceiver作为只要它在使用中。你可以使用 std::shared_ptr<Transceiver> m_target在里面 Request类,这意味着收发器至少与相关请求一样长。

为了更加灵活,也可以使用 std::weak_ptr<Transceiver> .然后收发器可以在请求时被销毁还活着。但是,当您尝试 std::weak_ptr<Transceiver>::lock()和它失败,你知道 Transceiver死了。

编辑:添加了一个方法来删除 Request如果它在 Transceiver 之前被销毁.

关于c++ - 请求-响应系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12263697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com