指针向量可能不存在的对象

问题描述 投票:2回答:2

我有一个对象A,我想用B类型的对象列表(对象的指针)包装,A应该处理。

问题是,一些B对象可以删除,而A不知道它。我知道我可以用异常处理它,但我宁愿避免它。

完整的问题:我正在编写C ++ SFML项目,我想用一个sf::RenderWindow指向对象的向量包装一个sf::Drawable *,该窗口应该绘制。问题是一样的。一些sf::Drawable对象可能已被删除,但sf::RenderWindow尝试使用它。

我可以取消包装的想法,但如果有一个好的设计解决方案,它会很棒。

c++ pointers stdvector
2个回答
2
投票

您可以使用std::unique_ptr,它将在true语句中返回falseif(),具体取决于它是否已被删除:

// use a std::unique_ptr that will record if its target has been deleted
std::vector<std::unique_ptr<sf::Drawable>> drawables;

// deleting an element

for(auto& drawable: drawables)
{
    if(needs_to_be_deleted(drawable.get()))
        drawable.reset(); // deletes object
}

// process elements

for(auto& drawable: drawables)
{
    if(drawable) // returns false if element is deleted
    {
        // pass by reference or pointer (using get())
        do_something_with_drawable(drawable.get());
    }
}

0
投票

您必须确保不重用内存,因为如果对象在您使用时不再存在,将导致未定义的行为。

为活动对象创建一个地图,如果它仍在地图中,则仅使用值

© www.soinside.com 2019 - 2024. All rights reserved.