好吧,这让我在几个月内难以接受,所以我会看看是否还有其他人可以帮忙解决这个问题。
所以在我的主程序中,我有两种结构(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(一种矛盾的术语,但我做了双关语,所以那里。)
答案 0 :(得分:3)
我认为它不会让你从裸指针自动构造shared_ptr
。 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
对您所做的事情可能有些过分。
答案 1 :(得分:2)
横向思维:
这里你实际上并不需要shared_ptr
,你想要的是一个STL(类似)集合,用于存储多态值;该集合是所有者。
你基本上有两个解决方案:
boost::ptr_vector
std::unique_ptr
,来自C ++ 11标准即使您可以访问C ++ 11,我仍然会建议boost::ptr_vector
,因为它提供了额外的保证(默认情况下不允许为null)和糖涂层(取消引用迭代器会提供引用,而不是指针而不是指针必须再次取消引用。)