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

时间:2017-10-27 19:43:52

标签: c++ pointers stdvector

我有一个对象A,我希望用B类型的A类型的对象列表(对象指针)包装。

问题是,某些B个对象可以被删除而A不知道它。我知道我可以用例外处理它,但我宁愿避免它。

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用std::unique_ptrtrue语句中返回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());
    }
}

答案 1 :(得分:0)

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

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