C++11 通过原始指针或引用获取 unique_ptr 的所有权?

标签 c++ pointers c++11

编辑
我想下面的代码会假设我有一个 addChild() 的重载版本,它接受一个已经包装在 unique_ptr 中的 Sprite,在那里取得所有权就可以了。只是想我会在其他人之前提到这一点。 :) 。经过漫长的一天,我在这里编写了所有代码,因此请将其视为伪代码质量,仅用于演示手头的问题。

原始问题

我正在编写一个框架,其中有一个显示列表、 parent / child 等。我认为使用 unique_ptr<Sprite> for example 是这里的方法,因为当您将子项添加到父显示对象时,父项现在成为该子项的唯一所有者是合乎逻辑的。

但是,将有可用的方法,例如 getChildAt(index)getChildByName等,我认为应该返回一个引用或指针值,因为这些方法只是为了向 child 公开操作,而不是转移所有权。

最后,这个问题和这个问题的原因,是在下面的情况下。假设我们有两个 Sprite显示列表根的子对象,Stage .假设我们有第三个子 Sprite。

Stage newStage;
std::unique_ptr<Sprite> parentOne(new Sprite);
std::unique_ptr<Sprite> parentTwo(new Sprite);
newStage.addChild(parentOne); //Stage takes ownership of parentOne
newStage.addChild(parentTwo); //Stage takes ownership of parentTwo

std::unique_ptr<Sprite> someChild(new Sprite);
parentOne->addChild(someChild) //parentOne takes ownership of someChild.

现在,让我们在游戏的代码库或任何使用此框架的地方说,someChild通过 getChildAt(int index); 访问.

Sprite& child = parentOne->getChildAt(0);

然后发生以下情况将是完全合法的。

parentTwo->addChild(child);

addChild方法处理从它的前一个父项中删除子项(如果父项存在),以便新的父项现在可以使这个子项成为其显示列表部分的一部分。

我从每个 sprite 返回 child(ren) 作为引用或指针,因为我们不想交出所有权(在诸如 getChildAt() 的方法中),只是提供对 child 的访问。我们不想将其作为 unique_ptr 交付让它超出范围并死亡。

但是,正如我所说,将这个子项(现在通过引用或指针访问)传递到另一个容器(比方说在拖放操作中,从一个容器中拖出一个项目)是完全合法和正常的列出另一个)。我们现在遇到的问题是唯一所有权需要从一个父级转移到另一个父级,但我们只有一个引用或原始指针。

我想知道解决这个问题的明智方法是什么。如果我返回一个指针,是否可以在这个阶段正确地转移所有权?

void Sprite::addChild(Sprite* newChildToOwn)
{
    /* by checking newChildToOwn->parent we can see that the child is already owned
    by someone else. We need to not only remove the child from that parents' part of the
    display list and add it here, but transfer exclusive object ownership of newChildToOwn
    to this->.
    */
}

最佳答案

release 方法获取指向对象的指针并将其从 unique_ptr 中释放

http://en.cppreference.com/w/cpp/memory/unique_ptr/release

对于您的结构,您可能应该有一个名为 releaseChild(index) 的方法,它通过返回指针来处理您的所有权。

关于C++11 通过原始指针或引用获取 unique_ptr 的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23179724/

相关文章:

c++ - 如何使用指向指针的指针

c++ - 你怎么知道 main 是否已经退出?

C++ SEH - EXCEPTION_DISPOSITION 枚举和 __except() 过滤器表达式之间的相关性

c++ - C++中size_t的性能

python - 将 mmap 指针作为 mmap 对象从 C 传递给 python

c++ - 处理指向模板中成员的指针,同时创建更简单的 `bind` 以与 asio 一起使用

c++ - 防止滥用逻辑运算符而不是按位运算符

c++ - 因shared_ptr而崩溃

c++ - 使用C++11的begin()和end()函数通过参数确定数组维数

c++ - move 构造函数和 `std::array`