簡體   English   中英

C ++ 11通過原始指針或引用獲取unique_ptr的所有權?

[英]C++11 take ownership of unique_ptr by the raw pointer or reference?

編輯
我想下面的代碼假設我有一個addChild()的重載版本,它接受一個已經包裝在unique_ptr中的Sprite,其中獲取所有權就沒問題了。 我以為在別人做之前我會提到它。 :)。 經過漫長的一天后,我在這里編寫了所有代碼,所以請把它作為偽代碼質量,只是為了證明手頭的問題。

原始問題

我正在編寫一個框架,其中有一個顯示列表,父母/孩子等。我認為使用unique_ptr<Sprite>就是這里的方法,因為當你將一個子項添加到父顯示對象時,它是只有父母現在成為該孩子的唯一所有者才合乎邏輯。

但是,會有一些方法可用,例如getChildAt(index)getChildByName等,我相信它們應該返回一個引用或指針值,因為這些方法只是為了將子項暴露給操作,而不是轉移所有權。

最后,問題和這個問題的原因是在以下情況。 讓我們假設我們有兩個Sprite對象,它們是顯示列表根的子節點, Stage 假設我們有第三個孩子雪碧。

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);訪問getChildAt(int index);

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

然后發生以下事件將是完全合法的。

parentTwo->addChild(child);

如果父項存在, addChild方法將處理從子項的前一個父項中刪除子項,以便新父項現在可以將此子項作為其顯示列表部分的一部分。

我將每個sprite中的子(ren)作為引用或指針返回,因為我們不想放棄所有權(在getChildAt()等方法中),只提供對子getChildAt()訪問。 我們不希望將其作為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)的方法,通過返回指針來處理所有權。

要轉移所有權,您需要訪問unique_ptr因為原始指針不知道如何使用它。

是否可以讓remove子方法返回unique_ptr以便在傳輸過程中對象保持活動狀態, Sprite將能夠獲得所有權? 這將允許您已經在其他地方使用引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM