gpt4 book ai didi

vector 元素上的 C++ 调用函数,派生自 vector 的基类

转载 作者:行者123 更新时间:2023-11-27 22:41:30 25 4
gpt4 key购买 nike

目前,我正在尝试在 SFML 之上编写一个 GUI 系统。现在,我也在实现简单的小部件。每个都有一个指向 sf::Drawables 的指针 vector (只是所有可绘制对象的基类)。在那个 vector 中,小部件的所有组件都被存储(例如,一个 sf::Text 对象作为标题,一个 sf::ConvexShape 对象作为按钮形状等等)。

现在我想遍历所有组件,并在每个可能的对象上调用一个名为“getGlobalBounds”的函数来检查鼠标。问题是,并不是所有的 sf::Drawable 派生类都有这个函数(例如,sf::Text 没有)。如何在每个实现了该函数的对象上调用该函数?

最佳答案

As you can see here ,它是提供 getGlobalBounds 功能的 sf::Sprite 类。

所以你想迭代你的 vector 并挑选出所有子类化的元素,然后调用它们的函数:

std::vector<sf::Drawable *> items;
for (sf::Drawable *item : items)
{
sf::Sprite *maybeSprite = dynamic_cast<sf::Sprite*>(item);
if (maybeSprite != nullptr) // Cast succeeded
{
maybeSprite->getGlobalBounds();
...
}
}

也就是说,如评论中所述,这不是一个理想的设计。也许你可以保留一个指向 sf::Drawables 的指针 vector ,它是指向 sf::Sprites 的指针 vector 中的指针的超集,并将项目添加到一个或两者都取决于它们的类型。然后您只需要迭代您知道提供该功能的项目,您就可以避免讨厌的dynamic_cast

关于 vector 元素上的 C++ 调用函数,派生自 vector 的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48602673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com