c++ - 如何创建虚拟类的 vector ?

标签 c++ inheritance virtual

我是 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 ,编译器和/或运行时(取决于编译器的后端是什么)将很难弄清楚类型的兼容性如何以及如果事情“不适合”内存时该怎么办,并且如何处理内存布局问题。

延伸阅读

关于c++ - 如何创建虚拟类的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24949743/

相关文章:

c++ - 按位操作,获得更大值(value)

c++ - 无法与 libx264.lib 静态库链接

java - 有没有办法将我所有重复的 VBox 重新组织到自定义 JavaFX 标签中?

c++ - 强制调用基类虚函数

c++ - 一维数组衰减为指针,但二维数组不会衰减,为什么?

c++ - 内存错误c++ private int

python - 如何继承异常来创建更具体的错误?

java - 如何使具有有界类型参数的方法排除一个子类?

c++ - 如何加速我的面向对象的 Iterator 类?

c++ - 为什么允许覆盖非虚函数?