2

什么是正确的做法?我知道如果容器是基类值类型,那么存储的派生对象是“切片”的。如果容器是派生类类型,则不能存储基类对象。对?

如果使用指针,auto_ptr 不能使用,因为它有复制语义问题。shared_ptr 是解决此问题的唯一解决方案吗?

谁能提供解决此问题的更多详细信息、示例代码或在线文章?这应该是一个很常见的问题,但是我在教科书或网上没有找到太多关于它的信息。

提前致谢。

顺便说一句,我只是在 unique_ptr 上搜索。它似乎不支持复制语义。那么在STL中使用不是只比auto_ptr安全,而是可能由于缺乏复制语义,许多STL操作或算法不能在unique_ptr的容器上使用?

4

4 回答 4

5

如果您想要多态行为(并且确实想要),那么您必须使用指针或引用。这在很多地方都有很好的记录。

由于不能使用引用容器,因此必须使用指针容器。

现在,您可以使用您认为合适的任何类型的指针:unique_ptrshared_ptr原始指针。

于 2012-09-02T09:05:25.807 回答
2

最明显的解决方案是使用std::unique_ptr

class IBase {};
class Derived : virtual public IBase {};
std::vector<std::unique_ptr<IBase>> v;
v.push_back(std::unique_ptr<IBase>(new Derived())); 

您可以使用std::shared_ptr,但它的所有权语义显着改变了程序的行为,使动态分配的对象保持活动状态,直到没有人持有对它们的引用。

于 2012-09-02T09:04:15.323 回答
2

有 std::vector 和 std::shared_ptr 的例子。我想这就是你想要的。

#include <iostream>
#include <memory>
#include <vector>

class Base {
public:
   virtual void foo() {
      std::cout << "base" << std::endl;
   }
};

class Derived : public Base {
   void foo() {
      std::cout << "derived" << std::endl;
   }
};

int main()
{
   std::vector<std::shared_ptr<Base> > v;
   v.push_back(std::shared_ptr<Base>(new Base));
   v.push_back(std::shared_ptr<Base>(new Derived));

   for (auto it : v) {
      it->foo();
   }
}
于 2012-09-02T09:06:13.073 回答
0

[http://www.boost.org/doc/libs/1_51_0/libs/ptr_container/doc/ptr_container.html](Boost 指针容器库)就是为此而生的。

于 2012-09-02T09:13:09.250 回答