如果向量类型是填充向量的两个子类型的父代,如何使用迭代器进行循环
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;
每个指针都会指向元素的地址,因此不会发生对象切片。
我有这个问题:
这是我以前使用的子类型的循环
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;
每个指针都会指向元素的地址,因此不会发生对象切片。