2011-04-25 98 views
0

我有一个很大的问题,比我要发布的要大得多,但如果有人可以帮助我,那么它将从这里顺利航行。为什么我的向量不能识别我的派生类?

好的,我的指针向量拒绝承认它的派生类。让我解释。

我有一类战士和向导从中派生的Player对象。 该作业要求我将所述对象(战士和向导)存储到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行>> *玩家[1]):

错误C2679:二进制“>>”:没有找到运营商 这需要类型的右手操作数 “球员”(或没有 可接受的转化率)

现在怎么办我解决这个问题?我觉得它不会把它当作战士或者向导,它总是把它当作一名球员,但我不想那么做!

P.S.我知道这一切似乎都是多余的,远离优化,但这正是我的教授想要完成的。 :|

任何帮助将不胜感激,因为我一直坚持这个小时!谢谢谢谢谢谢!

-Jon

+0

你确定你的教授不想让你做球员的抽象类和>>操作虚拟? – jabbie 2011-04-25 03:45:42

+0

我的教授说我只能把操作员>>重载在Warrior和Wizard中。 这不是抽象的,我之所以这样说的唯一原因是因为我班的人不在抽象类是她将作为一项任务的地方。 – Apothem 2011-04-25 04:14:04

回答

1

因为当你解引用指针,玩家在这里你receieving这个错误,你得到Player对象,而不是战士或精灵:

cin >> *players[i] 

和球员的对象不具备正如你所说的那样operator>>()

可能的解决方案:
1.使用dynamic_castPlayer*转换为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 
    } 
} 
+0

像动态铸造一样令人讨厌,它为我解决了问题。 我感谢您的帮助和大家的帮助! 我打算跟教授谈谈为什么她不让我们在Player类中使用istream。 再次感谢你们。 – Apothem 2011-04-25 04:21:35

+0

你的'operator <<'(应该是'operator >>',btw)不能是成员函数,因此不能是虚拟的。 – 2011-04-25 09:26:28

+0

@Marcelo Cantos:是的,我的错,谢谢。我已经重新编辑了我的答案,并在考虑这个主题时阅读了一些关于计算器的阅读) – beduin 2011-04-25 11:15:42

0
cin >> *players[i]; 

这是造成问题。你有没有过载operator>>为:

std::istream & operator>>(std::istream & in, Player &player); 
0

的问题是,你的operator>>实际上是期待一个战士操作,但矢量持有的玩家。

您可以从派生类向派生树上工作,但工作并不是一个好主意。 可以为通用的Player类实现operator>>,然后对它们进行操作,就好像它们是Wizard或Warrior一样。或者,在您的操作符>>内,您可以调用在这两个派生类中实现的纯多态函数,然后这将为您完成工作。

希望这有助于

+0

OP声称家庭作业的条款是这样的,他不允许为通用的'Player'类实现一个'operator >>'。 – QuantumMechanic 2011-04-25 04:00:56

+0

昆腾是正确的,因为我的局限性,我只能希望尝试像下面说的人那样动态演员。 – Apothem 2011-04-25 04:17:50

+0

为了回答他的问题,以上是为什么'矢量类不识别[他]派生类'。就实际设计而言,这是对他现有算法的简单重新思考 - 但我理解你的观点。 – 2011-04-25 04:19:06

0

你的教授可能被禁一个基类operator>>,因为这是行不通的。您无法使规范流读操作变为虚拟,因为第一个参数是流,而不是基类。

通常的解决办法是这样的:

class Player { 
    ... 
    virtual std::istream& read(std::istream& is) = 0; 
    ... 
}; 

std::istream& operator>>(std::istream& is, Player& p) { return p.read(is); } 
相关问题