创建的无效对象



所以,我有一个练习,我应该创建一个类生物。它必须有HP、名称和强度值。这就完成了。然而,如果生物的生命值或力量超出了规定的界限(生命值为0-100,力量为0-50),生物就会自我毁灭。为了做到这一点,我创建了一个函数来检查生物的值,并在值超出边界时调用析构函数。它确实有效,但是每当它销毁函数中的生物时,另一个void生物将在代码执行结束时被销毁。下面是控制台输出:

Creature's name :Barbude
Creature's health (between 1 and 100) :50
Creature's strength (between 1 and 50) :52
Strength value incorrect.
Name : Barbude
HP : 50
Strength : 0
Barbude is destroyed.
 is destroyed.

稍微解释一下,前3行用于用户输入。强度值错误。控制台在下一行向它发出信号。因此,该值被设置为0(我在setter中设置了这个值),这将破坏生物。巴布德被摧毁是我所期待的。但是最后一行意味着还有一个我不知道如何删除的对象

我试过使用&通过引用而不是通过值传递生物,但它不起作用并且总是出现void对象。下面是源文件中的代码:

//from the source file.
void checkCreature(Creature& c) {
    if (c.getPV() == 0 || c.getPV() <= 0 || c.getStrength() > 100 || c.getStrength() <= 0) {
        c.~Creature();
    }
}

int main() {
    Creature c1;
    c1.fillCreature();
    c1.creatureShowInfo();
    checkCreature(c1);
        return 0;
}
Creature::~Creature()
{ 
    cout << name << " is destroyed." << endl;
}

英语不是我的母语,如果有不清楚的地方,请向我咨询。

您的代码有UB。当手动调用析构函数时(大多数情况下不推荐这样做),对象不会神奇地消失。您需要将它从您拥有它的任何容器/存储中删除,否则,在作用域结束时,将再次调用析构函数(这是一个问题)。通常情况下,你可能会将你的生物存储在某种容器中(如std::vector<Creature>),所以要移除一个生物,你需要将其从容器中移除(如std::vector<Creature>)。你可以在checkCreature()中这样做,如果你传递一个对容器的引用,或者你可以在那里返回一个bool值,决定是否删除或保留该生物。

相关内容

最新更新