所以我目前正在研究我的OOP/C++技能并偶然发现以下情况:
我正在制作一个由实体组成的游戏,必须吃才能生存.他们可以吃其他实体或食物.为了实现这种行为,我创建了一个edible界面,它强制每个实现类创建一个getNutritionalInformation()方法来计算一个单位在宴会后的饱和度.
所以整个事情应该像代码一样工作:
std::unique_ptr<Entity> e1(new Entity);
std::unique_ptr<Entity> e2(new Entity);
std::cout << "Pre feasting energy: " << e1->getNutritionalInformation() << std::endl;
e1->eat(*e2);
std::cout << "After feasting energy: " << e1->getNutritionalInformation() << std::endl;
Run Code Online (Sandbox Code Playgroud)
在此操作之后,c1能量应该高于之前,该值当前在创建实体期间被随机分配.但是为了模拟被吃掉的实体的死亡,我想在它被吃掉时手动杀死它.我通过以下方式实现了这一点:
void Entity::eat(Edible& subject) {
this->energy += subject.getNutritionalInformation();
delete &subject;
}
Run Code Online (Sandbox Code Playgroud)
但最后这对我来说似乎有点脏,我真的想让智能指针以某种方式知道,它当前持有/指向的对象不再有效.有没有更清洁的方法来实现这一目标?我很确定我尝试这样做的方式非常hacky并且不被认为是正确的OOP编程.
提前谢谢你的帮助.
Nir*_*man 12
好吧,通过e2"吃" e1它实际上取得了它的所有权.具体而言,它必须拥有它,以便销毁它.所以这样做的方法实际上是这样的:
void Entity::eat(std::unique_ptr<Edible> subject) {
this->energy += subject->getNutritionalInformation();
}
Run Code Online (Sandbox Code Playgroud)
而且......就是这样.主题将在范围结束时自动销毁.为了使用它,你需要std::move明确地调用; 这表示您将所有权从调用范围转移到e2.
std::unique_ptr<Entity> e1(new Entity);
std::unique_ptr<Entity> e2(new Entity);
std::cout << "Pre feasting energy: " << e1->getNutritionalInformation() << std::endl;
e1->eat(std::move(e2));
std::cout << "After feasting energy: " << e1->getNutritionalInformation( << std::endl;
Run Code Online (Sandbox Code Playgroud)
请注意,在std::move调用之后e2,e2不能再假设实际指向实体(因为所有权已被转移).