我遇到了一个很大的问题,比我要发布的内容要大得多,但是如果有人可以帮我解决这个问题,那么从这里开始就会顺利进行。
好的,所以我的指针向量REFUSES来识别它的派生类。让我解释一下。
我有一类Player对象,Warrior和Wizard派生自这些对象。 赋值要求我将所述对象(Warrior和Wizard)存储到Player对象的指针向量中。 这就是我到目前为止所做的:
vector<Player *> players;
cout << "Please enter the number of players" << endl;
cin >> numOfPlayers;
total = amountPlaying(numOfPlayers);
for(int i = 0; i < total; i++)
{
temp = members();
if (temp == "Warrior" || temp == "warrior")
players[i] = new Warrior();
if (temp == "Wizard" || temp == "wizard")
players[i] = new Wizard();
else
{
cout << " wrong input, try again " <<endl;
i--;
}
cin >> *players[i];
}
会员功能:
string members()
{
string response;
cout << "Please select a Warrior or Wizard" << endl;
cin >> response;
return response;
}
我已经超载了战士和向导以通过cin接受输入,但不接受播放器(正如作业所说的那样)。 这是战士的样子(向导与向导相同):
istream& operator>>(istream& in, Warrior& warrior)
{
int base_strength, base_weapon_level, base_weapon_type;
cout << "Please enter his/her weapon of choice (1 = sword, 2 = axe, 3 = bow, 4 = knife)" << endl;
in >> base_weapon_type;
cout << "Please enter his/her weapon level" << endl;
in >> base_weapon_level;
cout << "Please enter strength" << endl;
in >> base_strength;
warrior.set_power(base_strength);
warrior.set_weapon_level(base_weapon_level);
warrior.set_weapon_type(base_weapon_type);
return in;
}
现在的问题是,我收到了这个错误(在cin&gt;&gt; * players [i]的行上):
错误C2679:二进制'&gt;&gt;' :没有操作员 发现哪个采取右手操作 类型'玩家'(或没有 可接受的转换)
现在我该如何解决这个问题?我觉得它不会把它当作战士或巫师,它总是把它当作一个玩家,但我不想要那个!
P.S。我知道这一切似乎都是多余的,而且从优化开始就是FAR,但这正是我教授希望它完成的方式。 :|
任何帮助都会受到赞赏,因为我已经被困在这上面了!谢谢谢谢!
-Jon
答案 0 :(得分:1)
您正在接收此错误,因为当您在此处取消引用Player的指针时,您将获得Player对象,而不是Warrior或Wizard:
cin >> *players[i]
播放器对象没有你所说的operator>>()
。
可能的解决方案:
1.在运行时使用dynamic_cast
从Player*
投射到Wizard*
或Warrior*
。你可以试试但有更方便的方法。示例代码:
Wizard * pwizard = dynamic_cast <Wizard*>(players[i]);
if (pwizard) {
// work with pwizard
}
else {
Warrior * pwarrior = dynamic_cast <Warrior*>(players[i]);
if (pwarrior) {
// work with pwarrior
}
}
答案 1 :(得分:0)
cin >> *players[i];
这引起了问题。您是否将operator>>
重载为:
std::istream & operator>>(std::istream & in, Player &player);
答案 2 :(得分:0)
问题是你的operator>>
实际上是期望在Warrior上运行,但是该向量会保留玩家。
您可以在派生树中使用派生类,但是向下工作并不是一个好主意。你可以做的是为通用的Player类实现operator>>
,然后对它们进行操作,就像它们是Wizard或Warrior一样。或者,在您的运算符&gt;&gt;中,您可以调用在两个派生类中实现的纯多态函数,然后这将为您完成工作。
希望这有帮助
答案 3 :(得分:0)
你的教授可能已经禁止基类operator>>
,因为它不起作用。您不能将规范流读取操作设置为虚拟,因为第一个参数是流,而不是基类。
通常的解决方案是这样的:
class Player {
...
virtual std::istream& read(std::istream& is) = 0;
...
};
std::istream& operator>>(std::istream& is, Player& p) { return p.read(is); }