-2
            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 方法来实现它

4

3 回答 3

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>.

如果您已将您更改std::vector为包含指针或std::reference_wrappers,您可以像这样访问敌人:

std::shared_ptr<Sprite1> enemyToMove = enemyList[g];
// or
std::shared_ptr<Sprite1>& enemyToMove = enemyList[g];

如果您仍然直接包含s,则需要保留对orSprite1返回的对象的引用,否则您将复制它:operator[]at

Sprite1& enemyToMove = enemyList[g];
于 2012-12-17T22:05:40.887 回答
1

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

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

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

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

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

于 2012-12-17T22:07:44.710 回答
0

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

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

于 2012-12-17T22:05:38.620 回答