在C++11
中,我们可以使用std::move()
将一个对象的所有权转移到另一个unique_ptr
。所有权转移后,让出所有权的智能指针变为null
,get()
返回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;
};
带有具体的子类Cat
和 Dog
:
struct Cat : Animal {
void speak() override { std::cout << "Meow!\n"; }
};
struct Dog : Animal {
void speak() override { std::cout << "Woof!\n"; }
};
而您想要一个简单的工厂,该工厂根据所需的服从值(value)来创建宠物。然后工厂必须返回一个指针。我们希望宠物工厂将创建的宠物的所有权转移给调用者,因此合理的返回类型是 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
存在一些争论(see comments on this blog post)到构造函数,但它看起来像这样:
class House {
private:
std::unique_ptr<Animal> pet_;
public:
House(std::unique_ptr<Animal> pet) : pet_(std::move(pet)) {}
};
我们通过了unique_ptr
进入构造函数,然后将其“move ”到成员变量中。
调用代码可能类似于:
auto pet = createPet(6.0);
House house(std::move(pet));
在构建 House
之后, pet
变量将是 nullptr
因为我们已将宠物的所有权转让给 House
.
关于c++ - 在 C++11 中将对象的所有权从一个 unique_ptr 转移到另一个 unique_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26318506/