我有一个对象A
,我希望用B
类型的A
类型的对象列表(对象指针)包装。
问题是,某些B
个对象可以被删除而A
不知道它。我知道我可以用例外处理它,但我宁愿避免它。
完整的问题:我正在编写C ++ SFML项目,我想用一个sf::RenderWindow
指向对象的向量包装sf::Drawable *
,该窗口应该绘制。问题是一样的。某些sf::Drawable
个对象可能已被删除,但sf::RenderWindow
会尝试使用它。
我可以取消包装的想法,但如果有一个好的设计解决方案,它会很棒。
答案 0 :(得分:2)
您可以使用std::unique_ptr在true
语句中返回false
或if()
,具体取决于是否已被删除:
// 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)
您必须确保不会重复使用内存,因为如果对象在您使用时不再存在,则会导致未定义的行为。
为活动对象创建一个地图,并且仅使用值(如果它仍在地图中)