如何声明一个创建永远不会为null的对象的函数?

时间:2014-04-06 14:03:17

标签: c++ pointers reference nullptr

我有一个创建对象QMenu(在堆中)

的函数
QMenu* createMenu(QWidget* parent); // parent will takes ownership of the menu

该函数永远不会返回空指针。但我认为声明并不能说明问题,因为它会返回一个指针。因此,在使用该方法时,我需要

if (QMenu* m = createMenu(parent))
    m->...

这很烦人。如果它返回一个引用,它就说明了这一点。

QMenu& createA(QWidget* parent);

我从未看到代码以这种方式声明。这个可以吗?有没有更好的声明?

3 个答案:

答案 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&);