1

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

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

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

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

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

QMenu& createA(QWidget* parent);

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

4

3 回答 3

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 为空,那么我自己的代码就搞砸了,程序也出错了。如果发生这种情况,请尽快退出程序!”

于 2014-04-06T14:57:23.587 回答
1

最简单和最清晰的方法是返回一个值:

A createA();

通常,如果您需要在“堆”上分配资源,一个好的策略是设计A成它自己处理这些资源。

于 2014-04-06T14:04:44.207 回答
1

是的,如果函数自行安排对象生命周期的所有权,则可以通过引用返回创建的对象。

执行此操作的函数的一个重要示例:V& std::map<K,V>::operator[](const K&);.

于 2014-04-06T15:50:40.110 回答