指向可能不存在的对象的指针向量
Vector of pointers to possibly nonexistent objects
我有一个对象 A
,我想用 B
类型的对象列表(指向对象的指针)包装,A
应该处理它。
问题是,某些 B
对象可以删除,而 A
不知道。我知道我可以处理例外情况,但我宁愿避免它。
完整问题:我正在编写 C++ SFML 项目,我想用 sf::Drawable *
指向对象的指针的向量包装 sf::RenderWindow
,window 应该绘制。问题是一样的。一些 sf::Drawable
对象可能已经被删除,但 sf::RenderWindow
试图使用它。
我可能会取消包装的想法,但如果有好的设计解决方案,那就太好了。
您必须确保内存不会被重复使用,因为如果对象在您使用时不再存在,将会导致未定义的行为。
为活动对象创建地图,并且仅使用仍在地图中的值
您可以使用 std::unique_ptr,它会 return 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());
}
}
我有一个对象 A
,我想用 B
类型的对象列表(指向对象的指针)包装,A
应该处理它。
问题是,某些 B
对象可以删除,而 A
不知道。我知道我可以处理例外情况,但我宁愿避免它。
完整问题:我正在编写 C++ SFML 项目,我想用 sf::Drawable *
指向对象的指针的向量包装 sf::RenderWindow
,window 应该绘制。问题是一样的。一些 sf::Drawable
对象可能已经被删除,但 sf::RenderWindow
试图使用它。
我可能会取消包装的想法,但如果有好的设计解决方案,那就太好了。
您必须确保内存不会被重复使用,因为如果对象在您使用时不再存在,将会导致未定义的行为。
为活动对象创建地图,并且仅使用仍在地图中的值
您可以使用 std::unique_ptr,它会 return 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());
}
}