所以我有4个类定义:
class Body
{//not important};
class CelestialBody: public Body
{//not important}
class Star: public CelestialBody
{//not important}
class Starship: public Body
{//not important}
然后我定义了这些对象的shared_ptrs向量:
vector<shared_ptr<Starship> > starships;
vector<shared_ptr<CelestialBody> > planetoids;
vector<shared_ptr<Star> > stars;
vector<Body*> bodies;
然后我用对象填充:
for(int i=0; i<1; ++i)
{
starships.push_back(shared_ptr<Starship>(new Starship));
bodies.push_back(starships[starships.size()-1].get());
}
for(int i=0; i<totalOfBodies; ++i)
{
planetoids.push_back(shared_ptr<CelestialBody>(new CelestialBody));
bodies.push_back(planetoids[planetoids.size()-1].get());
}
for(int i=0; i<0; ++i)
{
stars.push_back(shared_ptr<Star>(new Star));
bodies.push_back(stars[stars.size()-1].get());
}
这一切都按照我想要的方式运作:我有一个矢量可以到达所有的身体,我有一个向量来触及所有的小行星,所有的星星和所有星舰。但现在我想从bodies
向量和starships
向量中删除星舰,但我只知道bodies
向量中的索引:
if(bodies[j]->Type() == starshipType)
{
starships.erase(find(starships.begin(), starships.end(), bodies[j]));
//error: no match for ‘operator==’ (operand types are ‘std::shared_ptr<Starship>’ and ‘Body* const’)
}
bodies.erase(bodies.begin() + j);
我理解它产生的错误,但我不知道该怎么做。
Bo基本上我想要一个包含所有Bodies对象的大向量(所以也是孩子们)和几个包含不同类型对象的小对象,但是我仍然希望保留从大向量中删除对象的可能性特定的载体。
编辑:
好的,基本上我错过了将bodies
定义为vector<shared_ptr<Body> >
。
但是找到的部分不起作用:
starships.erase(find(starships.begin(), starships.end(), bodies[j]));
我在shared_ptr<Body>
的向量中搜索shared_ptr<Starship>
,它始终返回向量的结尾。如何在对象切片版本的同时搜索派生类的对象?
另一个编辑:
感谢您的快速回复。我认为std::find_if()
以及id系统将适合我。