无法从哑指针向量切换到boost :: shared_ptr

时间:2012-06-06 01:37:27

标签: c++ boost vector shared-ptr

好吧,这让我在几个月内难以接受,所以我会看看是否还有其他人可以帮忙解决这个问题。

所以在我的主程序中,我有两种结构(solarBody_t,ship_t),它们都来自同一个基类(physical_t)。我制作了两个物体的矢量,因为我不能将solarBody和一艘船放在同一个矢量中。它们都是哑指针向量 我尝试使用boost :: shared_ptrs的向量将两者放在同一个向量中。现在,根据我的理解,shared_ptrs应该具有与哑指针相同的语义和语法(例如foobar-> mass = 42;应该适用于两者)。但是,只需将声明更改为boost :: shared_ptr的向量到哑指针,当我尝试将某些东西推送到shared_ptrs的向量时,它会给我一个错误。

据我所知,这应该有效。

举例说明了提升文档
boost::shared_ptr<int> p(new int(2));

这正是我正在做的事情。

有没有人有过这方面的经验?或者想建议另一种方法将所有内容存储在向量中?

更多细节,here's the gist of it(一种矛盾的术语,但我做了双关语,所以那里。)

2 个答案:

答案 0 :(得分:3)

我认为它不会让你从裸指针自动构造shared_ptrpush_back期待shared_ptr<foobar_t>,而不是foobar_t。你应该看看boost::make_shared并尝试这样的事情:

entity_smart.push_back(boost::make_shared<foobar_t>(42));

make_shared有一些优点:即,它在一次分配中分配指针控制块和对象本身,并保持代码中不匹配的new。它还明确表明您正在为对象创建shared_ptr

除此之外,是的,语义应该基本相同。请注意,如果您实际上不需要共享对象的所有权,那么shared_ptr对您所做的事情可能有些过分。

答案 1 :(得分:2)

横向思维:

这里你实际上并不需要shared_ptr,你想要的是一个STL(类似)集合,用于存储多态值;该集合是所有者。

你基本上有两个解决方案:

  • 使用来自Pointer Container library
  • 的指针感知集合boost::ptr_vector
  • 使用更好的指针:std::unique_ptr,来自C ++ 11标准

即使您可以访问C ++ 11,我仍然会建议boost::ptr_vector,因为它提供了额外的保证(默认情况下不允许为null)和糖涂层(取消引用迭代器会提供引用,而不是指针而不是指针必须再次取消引用。)