我正在尝试在一个小型RPG战斗模拟的咒语系统中创建矢量的矢量。我要实现的主要目标是拥有一个向量咒语,玩家可以访问并选择他们想施放的咒语类型:火,冰等,然后选择咒语的名称:燃烧,冰霜,等
以下代码是我将Spell和FireSpell声明为的代码。我正在尝试将FireSpells的向量插入类型为vector的向量的向量中,但是不会插入。有没有办法使其插入?
我已经将FireSpell上的push_back尝试到Spells的向量中,并且工作正常,但是,当我将FireSpell矢量推入到vector Spell类型的向量中时,它总是返回错误。
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向量插入到PlayerSpells.push_back(PlayerFSpells);
行的外部Spell向量中,但是,它给了我错误消息:
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
答案 0 :(得分:1)
如果您来自其他语言,则可能会将可变值视为隐式引用。在这些语言中,通常可以轻松构造不同类型的集合,这些集合可以共享一个接口,也可以不共享一个接口,并且可以或可以不对它们进行多态处理(后期绑定)。
但是,在C ++中,对象不是引用:它们是内存中的实际对象,这要求它们具有编译时已知的大小。但是,您仍然可以通过指针或引用轻松地创建多态集合,甚至可以包含没有公共接口的对象集合。但是您必须对此加以明确说明-并且知道该语言的规则以防止出现诸如切片之类的陷阱(例如,参见What is object slicing?)。
答案 1 :(得分:0)
拥有
vector<vector<Spell>> PlayerSpells; vector<FireSpell> PlayerFSpells;
你不能做
PlayerSpells.push_back(PlayerFSpells);
因为vector<FireSpell>
不是vector<Spell>