作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我目前正在研究我的 OOP/C++ 技能并偶然发现了以下案例:
我正在制作一款由实体组成的游戏,实体必须进食才能生存。他们可以吃其他实体或食物。为了实现这种行为,我创建了一个 edible
接口(interface),它强制每个实现类创建一个 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;
此操作后 c1
的能量应该比之前更高,这个值目前是在创建实体期间随机分配的。但是为了模拟被吃掉的实体的死亡,我想在它被吃掉时手动杀死它。我通过以下方式实现了这一目标:
void Entity::eat(Edible& subject) {
this->energy += subject.getNutritionalInformation();
delete &subject;
}
但最后这对我来说似乎有点脏,我真的很想让智能指针以某种方式知道,它当前持有/指向的对象不再有效。有没有更清洁的方法来实现这一目标?我很确定我尝试这样做的方式非常 hacky 并且不被认为是正确的 OOP 编程。
提前感谢您的帮助。
最佳答案
好吧,通过 e2
“吃掉” e1
它实际上取得了它的所有权。具体来说,它必须拥有它,才能摧毁它。所以实现的方法实际上是这样的:
void Entity::eat(std::unique_ptr<Edible> subject) {
this->energy += subject->getNutritionalInformation();
}
然后...就是这样。主题将在范围结束时自动销毁。为了使用它,您需要显式调用 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;
请注意,在 e2
上调用了 std::move
之后,不能再假设 e2
实际上指向一个实体(因为所有权已经转移)。
关于c++ - 在以下情况下手动调用析构函数是否是一个糟糕的设计决策?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39377239/
我是一名优秀的程序员,十分优秀!