2016-01-14 47 views
1

我有一个类(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_pa​​ck_是nullptr,pack_是在构造函数中提供的 - 所以我们不拥有这个对象,我们只是将它序列化为data_msg_并发送。在接收端,我们在data_msg_中获得相同的数据 - 因此我们创建了由我们拥有的新对象(保存在owned_pa​​ck_中),然后将其从数据反序列化。

现在,它的工作原理很短 - 但我不确定它是否是最好的方法 - 尤其是,它使用了我不喜欢的非智能指针。那么你是否有一个想法,根据现代C++规则更多的东西?

+0

我在想,而不是两个指针可能使用的shared_ptr使用引用计数,我们没有自己的引用EventPack的情况下人为地增加 - 但我没有找到手动操纵shared_ptr的引用计数的方式。 – kompas

+1

我认为这个问题更适合于代码评论:http://codereview.stackexchange.com/ –

+0

@ kompas当对象被其他人拥有时,如果该对象在它仍然指向时不再存在,你希望发生什么至?或者你能证明这种情况不会发生吗? – user2079303

回答

0

由于您可以保证原始指针始终有效(当它被使用时),所以不需要智能指针,并且您当前的实现很好。

另一种选择是在外部源中使用shared_ptr,在PackRequest中使用单个shared_ptr。这增加了对象如何存储在外部源中的依赖关系(必须是shared_ptr),并且对引用计数有一些小的开销,但另一方面,您永远不需要测试哪个指针具有数据。

相关问题