Попытка вставить пользовательский тип вектора в пользовательский тип векторов - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь создать вектор векторов в системе заклинаний для небольшой битвы RPG.Основная цель, которую я пытаюсь достичь, - это иметь вектор заклинаний, к которым игрок может получить доступ, и выбрать тип заклинаний, которые он хочет разыграть: огонь, лед и т. Д., А затем выбрать название заклинания: ожог, мороз,и т. д.

Код ниже - это то, что я объявил Spell и FireSpell как.Я пытаюсь вставить вектор FireSpells в вектор типа векторных заклинаний, однако он не вставляется.Есть ли способ сделать так, чтобы он вставлялся?

Я пробовал push_back на FireSpell в вектор заклинаний, и он работает нормально, однако, он всегда возвращает ошибку, когда я push_back вектор FireSpell в вектортипа вектор Заклинание.

Magic.h

struct Fire
{
    int damage;
    int dps;
}; 

struct Spell
{
    int cost;
    string name;
};

struct FireSpell : Spell, Fire
{

};

Magic.cpp

#include <iostream>
#include "MagicSys.h"
#include <vector>
#include <string>
#include "Magic.h"

using std::cout;
using std::vector;

FireSpell burn;
FireSpell inferno;
FireSpell volcano;


int mainfunc()
{
    vector<vector<Spell>> PlayerSpells;
    vector<FireSpell> PlayerFSpells;
    PlayerFSpells.push_back(burn);
    PlayerFSpells.push_back(inferno);
    PlayerFSpells.push_back(volcano);

 /*Trying to insert FireSpell Vector into the end of the vector of Spell vectors*/

    PlayerSpells.push_back(PlayerFSpells);

    vector<vector<Spell>>::iterator it;
    for (it = PlayerSpells.begin(); it!=PlayerSpells.end(); ++it)
        cout << &it << " ";

    return 0;
}

Я ожидал, что внутренний вектор FireSpell будет вставлен во внешний вектор Spell на линии: PlayerSpells.push_back(PlayerFSpells);однако, это выдает мне сообщение об ошибке:

no instance of overloaded function "std::vector<_Ty, _Alloc>::push_back
[with _Ty=std::vector<Spell, std::allocator<Spell>>,
_Alloc=std::allocator<std::vector<Spell, std::allocator<Spell>>>]"
matches the argument list

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Если вы пришли из некоторых других языков, вы можете использовать изменяемые значения как неявные ссылки. На этих языках вы обычно получаете возможность легко создавать коллекции различных типов, которые могут иметь или не иметь общий интерфейс, и вы можете или не можете обрабатывать их полиморфно (позднее связывание).

Однако в C ++ объекты не являются ссылками: они являются реальными объектами в памяти, что требует от них размера, известного во время компиляции. Вы все еще можете довольно легко создавать полиморфные коллекции с помощью указателя или ссылки, или даже иметь коллекции объектов без общего интерфейса; но вы должны быть откровенны в этом - и знать правила языка, чтобы предотвратить такие ошибки, как нарезка (см., например, Что такое нарезка объектов? ).

0 голосов
/ 26 мая 2019

Имея

vector<vector<Spell>> PlayerSpells;
vector<FireSpell> PlayerFSpells;

, вы не можете сделать

PlayerSpells.push_back(PlayerFSpells);

, потому что vector<FireSpell> не является vector<Spell>

...