Почему мой вектор не распознает мои производные классы? - PullRequest
0 голосов
/ 25 апреля 2011

У меня огромная проблема, намного больше, чем то, что я собираюсь опубликовать, но если кто-то может мне помочь с этим, тогда все будет гладко.

Хорошо, мой векторуказатели ОТКАЗЫВАЕТСЯ распознавать его производные классыПозвольте мне объяснить.

У меня есть класс объектов 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, но не через Player (как было сказано в назначениик).Вот как выглядит Воин (Wizard такой же, но с Wizard):

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 >> * Players [i]):

ошибка C2679: двоичный файл '>>': не найден оператор, который принимает правый операнд типа 'Player' (или нет приемлемого преобразования)

Как мне это исправить?Я чувствую, что он не воспримет его как Воина или Волшебника, он ВСЕГДА воспринимает его как Игрока, но я не хочу этого!

PS Я знаю, что все это кажется излишним и FAR из-за оптимизации, но это именно то, какмой профессор хотел, чтобы это было сделано.: |

Буду признателен за любую помощь, так как я застрял на часах на этом!Спасибо, спасибо, спасибо!

-Jon

Ответы [ 4 ]

1 голос
/ 25 апреля 2011

Вы получаете эту ошибку, потому что когда вы разыменовываете указатель на Player здесь, вы получаете объект Player, а не Warrior или Wizard:

cin >> *players[i]

И у объекта Player нет operator>>(), как у васsaid.

Возможные решения:
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
  }
}
0 голосов
/ 25 апреля 2011

Ваш профессор, возможно, запретил базовый класс operator>>, потому что он не будет работать. Вы не можете сделать операцию чтения канонического потока виртуальной, поскольку первый параметр - это поток, а не базовый класс.

Обычное решение выглядит примерно так:

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

std::istream& operator>>(std::istream& is, Player& p) { return p.read(is); }
0 голосов
/ 25 апреля 2011

Проблема в том, что ваш operator>> на самом деле ожидает работать на Воина, но вектор содержит игроков.

Вы можете работать с производным классом вверх по дереву деривации, но работать вниз нетакая хорошая идея.То, что вы можете сделать, это реализовать operator>> для общего класса Player, а затем воздействовать на них, как если бы они были либо Wizard, либо Warrior.В качестве альтернативы, внутри вашего оператора >> вы можете вызвать чисто полиморфную функцию, которая реализована в обоих производных классах, и тогда это сделает всю работу за вас.

Надеюсь, это поможет

0 голосов
/ 25 апреля 2011
cin >> *players[i];

Это вызывает проблемы.Вы перегрузили operator>> как:

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