我有一个创建对象QMenu(在堆中)
的函数QMenu* createMenu(QWidget* parent); // parent will takes ownership of the menu
该函数永远不会返回空指针。但我认为声明并不能说明问题,因为它会返回一个指针。因此,在使用该方法时,我需要
if (QMenu* m = createMenu(parent))
m->...
这很烦人。如果它返回一个引用,它就说明了这一点。
QMenu& createA(QWidget* parent);
我从未看到代码以这种方式声明。这个可以吗?有没有更好的声明?
答案 0 :(得分:2)
最简单,最清晰的方法是返回一个值:
A createA();
通常,如果你需要在#34;堆上分配资源,一个好的策略是设计A
,以便它自己处理这些资源。
答案 1 :(得分:2)
只记录它不会返回null。作为一种解决方案,并不是非常高科技,但你会发现它在实践中很有效。
因为很明显你的函数没有返回null,所以你不必写:
if (QMenu* m = createMenu(parent))
m->...
你只需写:
QMenu* m = createMenu(parent);
m->...
考虑一下:要么你需要以某种形式进行if
检查 - 但是那时函数永远不会返回null。
或者函数真的永远不会返回null。然后if
检查没用。
话虽这么说,你仍然可以在那里添加一个额外安全的断言:
QMenu* m = createMenu(parent);
assert(m != nullptr); // if you use C++11; otherwise assert(m != 0);
m->...
这意味着“如果m为null,那么我自己的代码搞砸了,程序错了。如果发生这种情况,请尽快退出程序!”
答案 2 :(得分:1)
是的,如果函数自己安排了该对象的生命周期所有权,那么通过引用返回一个创建的对象是没问题的。
执行此操作的函数的一个重要示例:V& std::map<K,V>::operator[](const K&);
。