以下情形涉及從一個unique_ptr
轉移到另一個所有權:從函數返回,並作爲參數傳遞給像一個構造函數。
說你有一些多態型Animal
:
struct Animal {
virtual ~Animal() {}
virtual void speak() = 0;
};
與具體子類Cat
和Dog
:
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
的構造函數。還有一些爭議(see comments on this blog post)關於如何最好的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));
構建House
後,pet
變量會nullptr
因爲我們已經轉移了寵物所有權有關的House
。
Live demo
就是這樣。標準庫中的智能指針不應該被看作是自動釋放的指針,而是根據*所有權*。你有一些數據只能由一個實體「擁有」,然後使用唯一的指針。 – 2014-10-11 19:41:07
當您使用線程或套接字等不可複製的數據進行工作時,並且您需要將其從一個位置替換爲另一個位置(例如,將其放入向量中),這非常有用。 – wowofbob 2014-10-11 19:59:55