gpt4 book ai didi

c++ - 在以下情况下手动调用析构函数是否是一个糟糕的设计决策?

转载 作者:太空狗 更新时间:2023-10-29 19:41:31 25 4
gpt4 key购买 nike

所以我目前正在研究我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com