无法将对象保存到向量c ++

时间:2012-12-17 21:59:58

标签: c++

            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方法

3 个答案:

答案 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]; ,则需要保留对Sprite1operator[]返回的对象的引用,否则您将复制它:

at

答案 1 :(得分:1)

您发布的代码未在列表中存储enemy,而是存储副本的敌人。

您可能希望将enemyList的类型更改为std::vector<Sprite1*>,然后您可以使用

enemyList.insert(enemyList.end(), enemy);

插入您的对象(或为了简洁而将其替换为push_back()。)

这种方法意味着你必须照顾分配的内存,例如当你清除你的清单时,这会让你现在开始。

答案 2 :(得分:0)

.end()返回存储在向量中的最后一个元素。因此,它是插入内容的无效位置。

要将对象附加到向量的末尾,请使用.push_back()