如果向量类型是填充向量的两个子类型的父代,如何使用迭代器进行循环

How to for loop with iterators if vector type is parent of two child types filling vector

我有这个问题:

这是我以前使用的子类型的循环

std::vector<Coin>::iterator coin;

for (coin = coinVec.begin(); coin != coinVec.end(); ++coin)
{

    sf::FloatRect coinBounds = coin->getGlobalBounds();

    if (viewBox.intersects(coinBounds))
    {

        if (playerBounds.intersects(coinBounds))
        {
            coin = coinVec.erase(coin);
            break;
        }
        else coin->setTextureRect(currentFrame);

    }
}

std::vector<Heal> 的相似。

我将代码结构重建为:Coin 现在是 Collectables 的子项。

现在只有一个向量:std::vector<Collectables>,它包含所有可收集的子 类 对象,如 Coin、Heal 等。有没有办法让代码只使用一个循环和迭代器?如果是,你会怎么做?

谢谢

我发现我的代码非常通用,我根本不需要分离矢量元素。

我的解决方案:

std::vector<Collectables>::iterator collect;

for (collect = collectVec.begin(); collect != collectVec.end(); ++collect)
{

    sf::FloatRect collectBounds = collect->getGlobalBounds();

    if (viewBox.intersects(collectBounds))
    {

        if (playerBounds.intersects(collectBounds))
        {
            collect = collectVec.erase(collect);
            break;
        }
        else collect->setTextureRect(currentFrame);

    }
}

如果你真的需要分离元素,试试这个:

if (collect->getType() == ResourceManager::enums::textures::coin)
{

} else
    if (collect->getType() == ResourceManager::enums::textures::health)
    {

    }

其中 getType 仅存储匹配枚举值的 int id。

尽管您似乎已经解决了问题,但可能值得一提的是您将如何解决最初的问题。 如评论中所述,将元素存储在向量中会导致对象切片,例如

std::vector<BaseClass> vect;

向量的元素将能够存储关于对象的信息,这对于 类 来说很常见,也就是在 BaseClass 中定义的。如果你想能够执行 polymorphism(你试图在示例中实现),你应该像这样存储指针向量。

std::vector<BaseClass*> vect; 

每个指针都会指向元素的地址,因此不会发生对象切片。