我如何创建一个向量的虚拟类
How can I create a vector of virtual class?
我是一个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);}
}
}
};
下面是我的main:
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"的未解决的外部符号。
解决您的问题的最简单的方法是使用指针或智能指针:存储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
操作符。这是因为如果你试图将一个类型不是Unit
的对象分配给unit
,编译器和/或运行时(取决于你的编译器的后端是什么)将很难弄清楚这些类型是如何兼容的,如果事情"不适合"内存,该怎么办,以及如何处理内存布局问题。
进一步阅读
- 有关指针与智能指针的更多信息,请考虑这个线程。这里还有一个相关的Stackoverflow问题和一篇关于使用
shared_ptr
与STL集合的文章在这个线程中可以找到更多关于尝试"挤压"一种类型的对象到另一种类型(称为切片)的信息。你现在面临的问题是由于切片:当你添加一个King
到向量,它被切片成一个Unit
的实例。
解决这个问题的一种方法是将chessunit
转换为std::shared_ptr<Unit>
的向量,并在堆上分配单元。
注:由于没有定义Unit::moveunit()
,因此将其设置为纯虚的:
virtual void moveunit(vector<Unit> unitlist ,int nextX,int nextY) = 0;
^^^
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 获取向量C++中第一个值和最后一个值的和
- 从多个源构造一个对象,包括一个对象向量
- 为什么一个向量上的多线程操作很慢
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 将一个向量插入另一个向量的某个位置
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 将指向给定子类的指针从一个向量复制到另一个向量
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 紧凑向量一个小的内存足迹向量