我有一个类(PackRequest),它包含一些容器(EventPack)。根据使用情况,此容器可以由类对象拥有,也可以由某个外部来源提供。C++ - 可以在同一类中拥有或共享的对象
特别是,整个对象被转移到另一个进程,因此必须被序列化。所以在发送过程中,它是由一些外部来源提供的,然后才被序列化并传输。在接收过程中,我们必须从序列化数据中恢复它 - 因此,我们必须创建并拥有它。
我非常简单的解决方案解决了这个问题,但我不完全喜欢它:
class PackRequest : public Request {
private:
unique_ptr<EventPack> owned_pack_;
EventPack *pack_;
public:
PackRequest(EventPack *pack=nullptr)
: pack_(pack) {}
void serialize() override;
void unserialize() override;
};
然后序列化/反序列化功能如下:
void PackRequest::serialize() {
auto size = pack_->serialized_size();
data_msg_ = make_unique<zmq::message_t>(size);
pack_->serialize_bin(data_msg->cdata(), size);
}
void PackRequest::unserialize() {
owned_pack_ = make_unique<EventPack>();
pack_ = owned_pack_->get();
pack_->unserialize_bin(data_msg_->cdata(), data_msg_->size());
}
,然后在发送端owned_pack_是nullptr,pack_是在构造函数中提供的 - 所以我们不拥有这个对象,我们只是将它序列化为data_msg_并发送。在接收端,我们在data_msg_中获得相同的数据 - 因此我们创建了由我们拥有的新对象(保存在owned_pack_中),然后将其从数据反序列化。
现在,它的工作原理很短 - 但我不确定它是否是最好的方法 - 尤其是,它使用了我不喜欢的非智能指针。那么你是否有一个想法,根据现代C++规则更多的东西?
我在想,而不是两个指针可能使用的shared_ptr使用引用计数,我们没有自己的引用EventPack的情况下人为地增加 - 但我没有找到手动操纵shared_ptr的引用计数的方式。 – kompas
我认为这个问题更适合于代码评论:http://codereview.stackexchange.com/ –
@ kompas当对象被其他人拥有时,如果该对象在它仍然指向时不再存在,你希望发生什么至?或者你能证明这种情况不会发生吗? – user2079303