我通常将std::vector
中的对象存储为值,并使用std :: move来转移所有权。问题是,当与多态对象一起使用时,按值存储会导致切片。
此博客:https://oopscenities.net/2012/08/09/reference_wrapper/显示std::vector
可用于在std::vector
中存储多态对象。问题是,由于std::reference_wrapper
只是存储对象的引用,因此必须保证对象的生命周期为std::vector<std::reference_wrapper<>>
的生命周期。
例如:
class PolymorphicClass; //derived from SuperClass
namespace MyProject
{
class MyClass
{
public:
std::vector<std::reference_wrapper<SuperClass>> _member;
};
}
int main()
{
MyClass test;
test._member.push_back(PolymorphicClass());
}
这不会起作用。而不是std::reference_wrapper
我可以使用std::unique_ptr
,但我想知道是否还有其他选项。
答案 0 :(得分:1)
这完全取决于所有权,矢量与其元素相对应。如果您希望向量拥有,那么前进的方法是unique_ptr
。
如果您希望向量共享所有权以及代码中的其他系统,则可以使用shared_ptr
。
如果你不希望向量拥有对象的任何所有权,但仍然能够检查它们是否已被删除,那么前进的方法是weak_ptr
。
考虑到最后两个选项需要使用shared_ptr
创建对象,存储引用堆栈中分配的对象的共享指针(例如)将是讨厌的。