Sprite1 *enemy = new Sprite1(100, 100, "enemy.bmp", *screen);
enemy->DrawJon(screen);
enemyList.insert(enemyList.end(), *enemy);
由于某种原因,敌人没有被存储在列表中。有什么想法吗?
此外如何访问对象并在以下病房之后使用它们:
for (int g=0; g<enemyList.size(); g++)
{
Sprite1 enemyToMove = enemyList.at(g); //.at(g);
enemyToMove.MoveJon(0, 50, screen);
}
所以即使关闭了,我仍然希望人们知道解决方案是什么。我没有创建一个在类上设置属性的构造函数。最后,我能够使用默认构造函数和setter方法
答案 0 :(得分:3)
它在enemyList
结尾之前插入对象的副本。为此,您应该更喜欢enemyList.push_back(*enemy)
。但请注意,它是副本。如果你想引用std::vector
内外的同一个对象,你将需要一个指针向量(最好是智能指针)。例如:
std::vector<std::shared_ptr<Sprite1>> enemyList;
std::shared_ptr<Sprite1> enemy(new Sprite1(100, 100, "enemy.bmp", *screen));
enemy->DrawJon(screen);
enemyList.push_back(enemy);
或者,使用std::vector<std::reference_wrapper>
。
如果 已将<{1}}更改为包含指针或std::vector
,则可以像以下一样访问敌人:
std::reference_wrapper
如果您仍然直接包含std::shared_ptr<Sprite1> enemyToMove = enemyList[g];
// or
std::shared_ptr<Sprite1>& enemyToMove = enemyList[g];
,则需要保留对Sprite1
或operator[]
返回的对象的引用,否则您将复制它:
at
答案 1 :(得分:1)
您发布的代码未在列表中存储enemy
,而是存储副本的敌人。
您可能希望将enemyList的类型更改为std::vector<Sprite1*>
,然后您可以使用
enemyList.insert(enemyList.end(), enemy);
插入您的对象(或为了简洁而将其替换为push_back()
。)
这种方法意味着你必须照顾分配的内存,例如当你清除你的清单时,这会让你现在开始。
答案 2 :(得分:0)
.end()返回存储在向量中的最后一个元素。因此,它是插入内容的无效位置。
要将对象附加到向量的末尾,请使用.push_back()