为什么我的矢量不识别我的派生类?

时间:2011-04-25 03:39:28

标签: c++ pointers vector operator-overloading polymorphism

我遇到了一个很大的问题,比我要发布的内容要大得多,但是如果有人可以帮我解决这个问题,那么从这里开始就会顺利进行。

好的,所以我的指针向量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

4 个答案:

答案 0 :(得分:1)

您正在接收此错误,因为当您在此处取消引用Player的指针时,您将获得Player对象,而不是Warrior或Wizard:

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
  }
}

答案 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); }