一个窍门是恒定的基准返回:
选项1:
QPainter createPainter(const QColor& color) //definitely return by value
{
QPointer painter(&m_image);
painter.setBrush(color);
painter.setPen(color);
return painter;
}
则执行以下操作:
const QPainter& painter = createPainter(const QColor& color);
通过C++标准,这保证了没有复制将会发生,但返回值的寿命将延长。
选项2:
用户共享或唯一的指针。我知道你说他们有开销,但这没什么,假设你没有开发游戏引擎,而且这是主流(我确定你没有在这样的游戏引擎中使用Qt)。
方案3:
如果这些让你快乐,我会建议我讨厌的解决方案,只是为了完整性。使用宏!
#define CreatePainter(painter_name) \
QPointer painter_name(&m_image); \
painter_name.setBrush(color); \
painter_name.setPen(color);
要使用它:
CreatePainter(painter);
painter.begin();
//...
编辑:
选项4: 我刚刚学会(感谢昆汀),这是合法的:
QPainter createPainter(const QColor& color) //definitely return by value
{
QPointer painter(&m_image);
painter.setBrush(color);
painter.setPen(color);
return painter;
}
那么这个:
QPainter&& painter = createPainter(const QColor& color);
查阅参考文献here。这是一种新的C++ 11解决方案,可以在不使其成为常量的情况下延长对象的生命周期。
为什么不使用指针?像:'QPointer * p = new QPainter(&m_image); ...返回p;'? – vahancho
我不想在堆上分配对象,只是为了提取三行代码。 (在这种情况下,我会使用智能指针确保画家在任何情况下都能正常释放) – titapo
如果您要传输对象的所有权或以其他方式处理对象,则使用智能指针是有意义的。我没有看到你在这里需要它。不要以为使用“智能”指针会让你的代码更加智能化。 – vahancho