gpt4 book ai didi

c++ - 添加一个方法后类的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 14:55:32 24 4
gpt4 key购买 nike

所以我正在使用 C++ 开发简单的控制台战舰。我有一个像这样的船类:

class Ship {
public:
virtual void draw(int x, int y){}
virtual void shoot(int x, int y){}
virtual bool isDead(){};
};

和继承自它的两个类(水平船和垂直船)。所以垂直示例是:

class VertShip : public Ship{
private:
int x, y, shipSize;
char deck[4];
public:
VertShip(int x, int y, int shipSize) : x(x), y(y), shipSize(shipSize) {
for(int i=0; i<shipSize; ++i)
{
deck[i] = '_';
}
}
virtual void draw(int x, int y){
cout << deck[y - this->y];
}
virtual void shoot(int x, int y){
deck[y - this->y] = 'T';
--shipSize;
}

virtual bool isDead()
{
if(this->shipSize) return 0;
return 1;
}
};

所以我的牌组中的每个单元格都在对象内部表示。当某人调用 Board 类上的 fire() 方法并成功击中船只时,Shoot() 就会运行,而 draw() 会向 drawBoard() 方法提供有关船只甲板上给定单元格的信息。此外,ships[] 是指向 ships 对象的指针数组。所以到目前为止一切正常 - 问题出在 Board::fire():

void Board::fire(int w, int k){
if(mapOfCells[w][k]>=0)
ships[mapOfCells[w][k]]->shoot(w,k);
//if(ships[mapOfCells[w][k]]->isDead()) cout<<"The ship has drown.\n";
else
mapOfCells[w][k]=-2;
}

一旦我取消注释 if,奇怪的行为就开始了。它给了我不正确的信息(声称其中有船的单元格是空的,反之亦然)并且游戏在三枪后崩溃。然而,如果我评论它,它会完美地工作——只是不会让你知道你是否完全沉没了一艘船。

这是怎么回事?如果是这样的话,我是不是在做一些恶意的事情?遗憾的是,我无法提供一个简短的、可编译的源代码,因为如果没有大部分类和方法,这个游戏根本无法运行,而且其中有很多。

最佳答案

如果你简单地取消注释,那么语义就会改变:

目前是:

void Board::fire(int w, int k)
{
if(mapOfCells[w][k]>=0)
ships[mapOfCells[w][k]]->traf(w,k);
else
mapOfCells[w][k]=-2;
}

如果你取消注释,它会变成:

void Board::fire(int w, int k)
{
if(mapOfCells[w][k]>=0)
ships[mapOfCells[w][k]]->traf(w,k);

if(ships[mapOfCells[w][k]]->isDead())
cout<<"The ship has drown.\n";
else
mapOfCells[w][k]=-2;
}

不确定这是不是故意的。不过,您的意外行为可能来自于此,因为您的缩进看起来像是您另有打算。如上所述,您的默认实现还缺少一个返回值,该返回值应该给您一个编译器警告和未定义的结果。

关于c++ - 添加一个方法后类的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969861/

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