我正在设计一个国际象棋游戏(C ++初学者)但是我仍然坚持我的单个棋子类型的检查过程,例如一次仅移动1个空间的棋子,除了第一次移动2个空格,等等。
我有一个片段类,其子类是pawn,king等,其中包含方法:
check(string position,string destination);
并返回一个布尔值,是否可以移动到目的地。
我有一个指向我已经定义的每一件作品的指针:
pawn pawnPieces[16];
piece *pointer[16];
for (i=0;i<16;i++)
{
pointer[i]=&pawnPieces[i];
}
在我初步检查之后,我想从main调用上面的检查功能,作为测试:
cout << pointer[1]->check("B1","C1") << endl;
这给了我错误&#34;没有名为&#39; check&#39;在一块&#34;这是有道理的,但我确信有一种方法可以将棋子类与棋子,国王等联系起来。
我想我需要根据我所读过的内容对虚函数做些什么,但我不知道如何处理这个问题。如果有人能提供一些非常感激的指示。
这种尝试从指向上面的类的指针调用子类函数的方法可能存在根本缺陷,或许我需要修改我的设计才能实现这个目标?我仍然希望将pawn类的check方法保持在相同的位置,因为我认为它很好地封装了它。
编辑:我在片段类中创建了一个纯虚函数:
virtual bool check(string positionIN,string destination)=0;
现在,当我打电话给上面的cout线时,我遇到了分段错误,我不确定原因。我假设它是因为我使用指针?
EDIT2:谢谢你!我已经实现了这个但是我得到了一个小错误,虚拟意味着附加到pawn和king类?根据我的理解,我认为虚拟标签仅适用于基类。
EDIT3:我明白了,我在类pawn和king中用虚拟标签标记了检查函数并编译了它。
现在我通过调用对象本身来获得分段错误
pawnPieces[1].check("B1","C1")
并通过调用指向对象的指针
pointer[1]->check("B1","C1")
来自main,我不知道为什么。
EDIT4:现在全部工作,我从主要调用它来测试,但是当我从我的程序中调用它时一切正常,谢谢大家!
答案 0 :(得分:2)
您尝试做的正是virtual
方法的用途。
class piece
{
public:
virtual bool check(string position, string destination) = 0;
};
class pawn : public piece
{
public:
virtual bool check(string position, string destination)
{
return ...;
}
};
class king : public piece
{
public:
virtual bool check(string position, string destination)
{
return ...;
}
};