列表与向量与抽象类

时间:2019-04-13 05:02:04

标签: c++ list class vector abstract-class

警告:没有经验的人提出的问题:)

嗨,

我正在为太空作业制作一个模拟太空入侵者的模型,并且正在研究船和外星人会发射/落下的子弹。我有一个抽象的基类来处理所有子弹,有两个派生类-导弹和炸弹。

我最初使用向量,但是我读到某个地方,列表会变得更加高效,因为它们可以如此快地添加和删除(?)。 但是,我是列表的新手,因此遇到了一些麻烦。老实说,我不完全确定如何或是否可以将列表与抽象类一起使用。

我还没有实施炸弹课程,因为我想先让导弹课程开始工作。

以下是基类(射击)+导弹的标题:

enum attackType { BOMB, MISSILE };

class shot
{
private:
    float xPos,
          yPos;
    attackType bombOrMissile;
public:
    shot(Vector2f pos, attackType b_OR_m);     // passed ship pos + who fired shot
    virtual void draw(RenderWindow & win) = 0; // draws bullet on screen
    virtual Sprite & getSprite() = 0;          // gives sprite information

};

class missile : public shot
{
private:
    Sprite missileSprite;
public:
    missile(Vector2f pos, Texture & t);
    void draw(RenderWindow & win);
    Sprite & getSprite();
};

我有一个“射击管理器”类,用于控制项目符号列表。它增加/减少列表并更改精灵位置。

标题:

class shotMgr
{
private:
    list<shot*> shotsFired;
    Texture missileTexture;
public:
    shotMgr(); // loads texture
    void shoot(attackType b_OR_m, Vector2f pos);
    void disappear();
    void move();
    void draw(RenderWindow& win);
    int getAmountFilled() { return shotsFired.size(); }
};

我的主要问题是:我该如何处理语法?我正在努力解决ptrs问题。在这种情况下,向量最终将是更好的选择,还是我做错了什么?

这是我的shotMgr函数之一,用于演示我当前正在做的事情(它没有编译);其他功能在语法上相似:

void shotMgr::disappear()
{
    list<shot>::iterator iter;
    for (iter = shotsFired.begin(); iter != shotsFired.end();)
    {
        if (iter->getSprite().getPosition().y < 0)
        {
            iter = shotsFired.erase(iter);
        }
        else
            iter++;
    }
}

任何建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

在集合的末尾添加和删除时,

std::vector效率最高。当代码从向量的任何其他位置插入或删除时,所有索引大于要访问的元素的元素都将发生“移动”。也就是说,当您插入时,数组中该元素右侧的所有内容都需要“移动一个”。同样,在删除时,要删除的元素右侧的所有内容都需要向左滑动。与使用普通数组作为集合没有什么不同。

std::list更类似于链接列表。每个元素可能使用更多的内存,但是绝对适合随机插入和删除。但是listvector的使用并不是问题的根源。

关于您的编译错误。可能是由于以下原因:

list<shot>::iterator iter;

您要声明list<shot>::iterator的迭代器,但是您的集合的类型为list<shot*>。因此,您可能需要list<shot*>::iterator。让我们修正您的功能。 auto进行救援,因此您不必太费力地考虑这些东西。

void shotMgr::disappear()
{
    for (auto iter = shotsFired.begin(); iter != shotsFired.end();)
    {
        shot* ptrShot = *iter;

        if (ptrShot->getSprite().getPosition().y < 0)
        {
            iter = shotsFired.erase(iter);
        }
        else
        {
            iter++;
        }
    }
}