簡體   English   中英

將對象的所有權從一個unique_ptr轉移到C ++ 11中的另一個unique_ptr?

[英]Transferring the ownership of object from one unique_ptr to another unique_ptr in C++11?

C++11我們可以使用std::move()將對象的所有權轉移到另一個unique_ptr 所有權轉移后,放棄所有權的智能指針變為nullget()返回nullptr.

std::unique_ptr<int> p1(new int(42));
std::unique_ptr<int> p2 = std::move(p1); // Transfer ownership

在將所有權轉移到另一個unique_ptr ,這會有什么用處?

以下情況涉及將所有權從一個unique_ptr轉移到另一個:從函數返回,並作為參數傳遞給類似構造函數的函數。

假設你有一些多態類型Animal

struct Animal {
  virtual ~Animal() {}
  virtual void speak() = 0;
};

與具體子類CatDog

struct Cat : Animal {
  void speak() override { std::cout << "Meow!\n"; }
};

struct Dog : Animal {
  void speak() override { std::cout << "Woof!\n"; }
};

而且你想要一個簡單的工廠,根據所需的服從價值創造寵物。 然后工廠必須返回一個指針。 我們希望寵物工廠將創建的寵物的所有權轉移給調用者,因此合理的返回類型是std::unique_ptr<Animal>

std::unique_ptr<Animal> createPet(double obedience) {
  if (obedience > 5.0)
    return std::make_unique<Dog>();
  return std::make_unique<Cat>();
} 

現在,假設我們要創建一個擁有寵物的House ,那么我們可能想要將寵物傳遞給House的構造者。 關於如何最好地將unique_ptr傳遞給構造函數,有一些爭論( 請參閱此博客文章的評論 ),但它看起來像這樣:

class House {
 private:
  std::unique_ptr<Animal> pet_;
 public:
  House(std::unique_ptr<Animal> pet) : pet_(std::move(pet)) {}
};

我們已將unique_ptr傳遞給構造函數,然后將其“移動”到成員變量中。

調用代碼可能類似於:

  auto pet = createPet(6.0);
  House house(std::move(pet));

在構建Housepet變量將為nullptr因為我們已將寵物的所有權轉讓給House

現場演示

例如,如果調用函數,則可以在參數列表中move unique_ptr ,使其成為函數簽名的一部分

foo ( std::unique_ptr<T>&& ptr )

你可以打電話給foo

foo( std::move(myPtr) );

請注意, std::move是一個無條件轉換, unique_ptr是一個具有狀態的對象,該狀態的一部分是該unique_ptr正在管理的指針,使用std::move你正在轉換整個對象,你不是真的改變任何關於所有權的東西,使用std::movestd::unique_ptr並沒有什么特別之處,因為std::move並不真正關心任何特定的東西,因為我說它是一個無條件的unique_ptr而且unique_ptr只是被渲染,整個作為unique_ptr<T>類型的實例的對象被轉換。

如果你想談談你的unique_ptr指向的對象的所有權轉移,你應該考慮std::unique_ptr<T>本身提供的swap

暫無
暫無

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

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