//我在制作名为Square的垄断游戏中有一个基类。其中一个派生类称为freeParking。 freeParking类有一个叫做playSquare的函数,我试着调用这个函数,但是main中的playSquare函数调用给了我错误。这是我试图使用的代码:
//基本方阵
#pragma once
#include <string>
#include <iostream>
using namespace std;
class Square
{
public:
Square(string d);
string displayName();
private:
string squareName;
};
//继承Square类
的freeParking类#pragma once
#include "Square.h"
#include "Player.h"
#include <iostream>
class freeParking : public Square
{
public:
freeParking(string a);
void playSquare(Player *player, Player *otherPlayer);
private:
};
// freeParking playSquare函数
#include "FreeParking.h"
using namespace std;
freeParking::freeParking(string a)
:Square(a)
{
}
void freeParking::playSquare(Player *player, Player *otherPlayer)
{
cout << "Player " << player->returnPlayerPiece() << " lands on free parking" << endl;
cout << "Player " << player->returnPlayerPiece() << " is resting" << endl;
}
//在main
中调用playSquare函数vector <Square> squaresVector;
Square* square = new freeParking(squares[readCount]);
squaresVector.push_back(*square);
int a = 0;
for (vector<Square>::iterator it = squaresVector.begin(); it <squaresVector.end(); it++)
{
squaresVector[a]->playSquare(Player *p1, Player *p2);
a++;
}
//我有什么想法我做错了什么?欢呼声。
答案 0 :(得分:1)
您尚未playSquare
接口的Square
部分。您似乎希望playSquare
特定于广场的类型,但您也希望能够在Square*
上调用它而不知道Square
的类型。为此,请将playSquare
设为虚拟方法。
class Square {
string squareName;
public:
Square(string d);
string displayName();
virtual void playSquare(Player* p1, Player* p2) = 0;
...
};
将virtual
添加到派生类的playSquare
声明的前面。这是一个纯虚函数,这意味着它没有在基类中定义,但必须在实际实例化的任何派生类中定义。如果您不喜欢此限制,请将= 0
替换为{}
,以使其为默认定义。我的猜测是,考虑到游戏板的上下文,你需要为每个派生类定义一个定义。
修改强>
您不能使用std::vector
来存储多态对象(具有虚函数的对象)。在这种情况下,向量将仅为其模板参数的类型Square
分配内存。任何与派生类相关的数据都将被切断。您可以使用std::vector<Square*>
来解决此问题。由于对象不再存储在向量中,我们不再有这个问题。
在相关的说明中,您无法在不知道Square
是什么类型Square
的情况下复制Square
对象,因为freeParking
复制构造函数不知道如何处理push_back
{1}}对象的一部分。您的a
操作会尝试执行此操作。
我还注意到你使用两个循环计数器没有特别的原因。摆脱for(vector<Square*>::iterator it = squaresVector.begin(); it != squaresVector.end(); ++it) {
(*it)->playSquare(p1, p2); //p1 and p2 are of type Player*
}
,因为你已经定义的迭代器允许你访问向量的每个元素。
playSquare
我怀疑你是想在你传递它们的时候声明{{1}}的论点。