以下情况涉及将所有权从一个
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"; }
};
你希望创建一个简单的工厂,根据顺从度的要求值创建宠物,并返回指针。我们希望宠物工厂将所创建的宠物的所有权转移给调用者,因此合理的返回类型是 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));
在构建完House
之后,pet
变量将会是nullptr
,因为我们已经将宠物的所有权转移到了House
。
实时演示