类添加一个方法后的奇怪行为
Weird behaviour of a class after adding one method
所以我正在用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
语句正在无条件执行。
相关文章:
- C++从另一个类访问公共静态向量的正确方法是什么
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何制作一个将函数作为参数的类方法
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 检查哪个对象调用了另一个对象的对象方法
- 不能将方法返回的值用于另一个方法
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- Qt将信号与另一个类方法连接
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 一个模板方法,用于同时接受常量和非常量参数
- 对具有相同方法的不同类使用一个变量
- 将一个类的方法指针存储到另一个类中
- 从另一个标头中的标头调用静态方法
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- 模板中的方法:一个有效,一个不实例化