3

好吧,这让我困扰了几个月,所以我会看看是否有其他人可以帮助解决这个问题。

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

据我所知,这应该可行。boost 文档给出了以下示例

boost::shared_ptr<int> p(new int(2));

这几乎就是我正在做的事情。

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

有关更多详细信息,这是它的要点(有点矛盾,但我做了双关语,所以在那里。)

4

2 回答 2

3

我认为它不会让您自动shared_ptr从裸指针构造 a 。push_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,如果您实际上不需要共享对象的所有权,那么这对于您正在做的事情可能有点过头了。

于 2012-06-06T01:45:08.847 回答
2

横向思维:

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

您基本上有两种解决方案:

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

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

于 2012-06-06T08:48:52.600 回答