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

Weird behaviour of a class after adding one method

本文关键字:方法 一个 添加      更新时间:2023-10-16

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

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;
        }
};

所以deck的每个单元格都在对象中表示。当有人调用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;
}

不确定这是否是有意的。然而,您的意外行为可能来自于此,因为您的缩进看起来像是您想要的其他内容。如上所述,您的默认实现也缺少一个返回值,该返回值会给您一个编译器警告和未定义的结果。

试着用花括号括住你的if子句。您的else子句绑定到第二个if语句而不是第一个,并且您的第二个if语句正在无条件执行。