C++ 将所有权转让给经理

C++ 将所有权转让给经理,c++,memory,c++11,memory-management,ownership,C++,Memory,C++11,Memory Management,Ownership,我试图为基于组件的系统中的实体编写一个管理类。我不确定如何继续将实体添加到此类中。我想到了几种方法,但是我不确定正确的方法是什么 第一种方法是将对象移动到管理器中 void addEntity(Entity && in){ entities.emplace(std::move(in)); } 但是,接下来我需要处理移动构造函数,这应该不会太难 另一种方法是传入指针或std::unique\u ptr。这样,我就不需要担心所有权问题,因为它会使传入的指针无效 void add

我试图为基于组件的系统中的实体编写一个管理类。我不确定如何继续将实体添加到此类中。我想到了几种方法,但是我不确定正确的方法是什么

第一种方法是将对象移动到管理器中

void addEntity(Entity && in){
  entities.emplace(std::move(in));
}
但是,接下来我需要处理移动构造函数,这应该不会太难

另一种方法是传入指针或
std::unique\u ptr
。这样,我就不需要担心所有权问题,因为它会使传入的指针无效

void addEntity(std::unique_ptr<Entity> in){
  entities.emplace(in);
}
void addEntity(std::unique_ptr in){
实体。安置(在);
}

然而,我不确定哪种方法更好

第一个方法只有在使用客户端代码中的右值调用它时才有效。这是一个很大的限制,因此您必须为左值引用提供另一个重载。如果使用“通用参考”并完美地转发到
emplace
,您实际上可以同时执行这两项操作。缺点是它使用模板,因此
实体
类型从签名中消失:

template <typename T>
void addEntity(T&& in){
  entities.emplace(std::forward<T>(in));
}
归根结底,这取决于谁应该负责创建唯一的对象。您是希望Manager类拥有客户端为您准备的某些已经存在的唯一对象,还是希望拥有一个更灵活的Manager类,根据提供的参数自行执行移动/复制操作


我会选择完美的转发或两个重载解决方案,因为它会带来更干净的界面和更好的客户端代码。

什么是“将对象移动到管理器中”?为什么不简单地给管理者对象的地址并让它留在原地呢?如果没有更多的上下文,很难说清楚,但第一个对我来说似乎很好。考虑第二个问题的主要原因之一是如果你处理多态性<代码>实体< /Cord>类型。@ Walyk我希望管理者拥有实体的所有权。我可能会从一个文件中读取这些实体,然后按顺序将它们添加到管理器中,以便在需要时销毁它们,但也可能存在于其中。@Praetorian Enttiy将不是多态类型。
Entity entity(...);
manager.addEntity(std::make_unique<Entity>(entity)); // copy ctor
// or
manager.addEntity(std::make_unique<Entity>(std::move(entity))); // move ctor to heap