gpt4 book ai didi

c++ - 将所有权转让给经理

转载 作者:行者123 更新时间:2023-11-30 02:45:59 25 4
gpt4 key购买 nike

我正在尝试为基于组件的系统中的实体编写一个管理类。我不确定如何继续将实体添加到此类中。我有几种方法可以做到这一点,但我不确定正确的方法是什么。

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

void addEntity(Entity && in){
entities.emplace(std::move(in));
}

但是,我需要处理移动构造函数,这应该不会太难。

另一种方法是传入一个指针或std::unique_ptr。这样,我就不必担心所有权问题,因为它会使传入的指针无效。

void addEntity(std::unique_ptr<Entity> in){
entities.emplace(in);
}

但是,我不确定哪种方法更好。

最佳答案

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

template <typename T>
void addEntity(T&& in){
entities.emplace(std::forward<T>(in));
}

unique_ptr 方式对于客户端来说有点冗长,因为他们必须自己创建 unique_ptr

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

归结为由谁负责创建唯一对象的决定。您是希望 Manager 类获得客户端为您准备的一些已经存在的唯一对象的所有权,还是希望有一个更灵活的 Manager 类,它会根据提供的参数自行移动/复制。

我会选择完美转发或二次重载解决方案,因为它会产生更清晰的界面和更好的客户端代码。

关于c++ - 将所有权转让给经理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23973959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com