C++ - 可以在同一类中拥有或共享的对象



我有一个类(PackRequest),其中包含一些容器(EventPack)。根据用途,此容器可以由类对象拥有,也可以从某个外部源提供。

特别是,整个对象被转移到另一个进程,因此必须序列化。因此,在发送过程中,它是从某个外部源提供的,然后仅序列化和传输。在接收过程中,我们必须从序列化数据中恢复它 - 因此,我们必须创建和拥有它。

我用非常简单的解决方案解决了它,但我并不完全喜欢它:

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,并在PackRequest中使用单个shared_ptr。这增加了对对象在外部源中的存储方式的依赖(必须是shared_ptr),并且对引用计数有一些小的开销,但另一方面,你永远不需要测试哪个指针有数据。

相关内容

  • 没有找到相关文章

最新更新