我是 C++ 的新手,所以我决定从事一些小项目来提高自己。我尝试用类 Unit 和继承自 Unit 的类 King 编写一个简单的国际象棋程序
#include <list>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stdlib.h> /* abs */
using namespace std;
// Each unit class represent a chess unit
class Unit{
protected:
int currentX;
int currentY;
string side;
public:
Unit();
Unit(string sideplay, int Xpos,int Ypos)
{
currentX=Xpos; currentY= Ypos;side=sideplay;
}
int getX()
{
return currentX;
}
int getY()
{
return currentY;
}
string getside()
{
return side;
}
void setpos(int newX,int newY) //set new position
{
currentX=newX;
currentY=newY;
}
bool validmove(vector<Unit> unitlist ,string sidepick,int Xpos,int Ypos)
{ int i=0;
while(i != 3)
{ int X=unitlist[i].getX();
int Y=unitlist[i].getY();
string sidetemp= unitlist[i].getside();
if ((X==Xpos)&&(Y==Ypos)&&(sidetemp==sidepick))
{
return false;
}
else if ((X==Xpos)&&(Y==Ypos)&&(sidetemp!=sidepick))
{ //unitlist[i]=NULL;
return true;
}
i++;
}
return true;
}
virtual void moveunit(vector<Unit> unitlist ,int nextX,int nextY);
};
class King: public Unit{
public:
King(string sideplay, int Xpos,int Ypos):Unit(sideplay,Xpos,Ypos)
{}
void moveunit(vector<Unit> unitlist ,int nextX,int nextY){
int diffX=abs(nextX-currentX);
int diffY=abs(nextY-currentY);
if ((diffX==1)||(diffY==1))
{ if (validmove(unitlist,side,nextX,nextY))
{
setpos(nextX,nextY);}
}
}
};
这是我的主要内容:
int main()
{
vector<Unit> chessunit;
chessunit.push_back(King("white",3,1));
chessunit.push_back(King("black",3,2));
chessunit.push_back(King("white",4,1));
if (chessunit[0].validmove(chessunit,"white",3,2))
{
cout<<"hehe"<<endl;
}
chessunit[0].moveunit(chessunit,3,2);
int k= chessunit[0].getY();
cout<<k<<endl;
return 0;
}
我不断收到 LNK 2001 错误:虚拟方法“moveunit”的未解析外部符号。我该如何修复该错误?
最佳答案
解决问题的最简单方法是使用指针或智能指针:Store vector<Unit*>
, vector<std::shared_ptr<Unit>>
或 vector<std::unique_ptr<Unit>>
(感谢@rubenvb)而不是vector<Unit>
然后像这样添加你的国王:
myVector.push_back(new King...); // or
myVector.push_back(std::shared_ptr<King>(new King...)); // or
myVector.push_back(std::unique_ptr<King>(new King...));
为什么?
如果你分配一个虚拟类的对象(例如 Unit unit
)并且你想分配一个该类的实现对象给它,例如:
Unit unit;
unit = King(...);
除非你为 Unit
提供一个构造函数,否则你会得到一个错误,或者至少会遇到麻烦。这需要 King
作为论据或提供足够的 move
运算符(operator)。这是因为如果您尝试分配一个类型不是 Unit
的对象至 unit
,编译器和/或运行时(取决于编译器的后端是什么)将很难弄清楚类型的兼容性如何以及如果事情“不适合”内存时该怎么办,并且如何处理内存布局问题。
延伸阅读
- 有关指针与智能指针的更多信息,请考虑 this thread .这里还有一个 related Stackoverflow question和 an article on using
shared_ptr
with STL collections - 有关尝试将一种类型的对象“压缩”到另一种类型(称为切片)的更多信息,请参阅 this thread .
关于c++ - 如何创建虚拟类的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24949743/