【发布时间】:2014-04-06 14:03:16
【问题描述】:
我有一个函数可以创建一个对象 QMenu(在堆中)
QMenu* createMenu(QWidget* parent); // parent will takes ownership of the menu
函数永远不会返回空指针。但我认为声明并没有说明这一点,因为它返回了一个指针。因此在使用该方法时,我需要
if (QMenu* m = createMenu(parent))
m->...
这很烦人。如果它返回一个引用,它就说明了这一点。
QMenu& createA(QWidget* parent);
我从来没有见过这样声明的代码。这个可以吗?有没有更好的声明?
【问题讨论】:
-
引用版本不起作用,因为您无法返回对本地对象的引用。如果您的函数执行
return *new X;之类的操作,那么它比原始版本更令人困惑,因为调用者必须记住在某些时候执行delete &m; -
也许您可以使用
createMenu函数上的throw规范来记录您的意图,甚至可能是“返回有效的 QMenu,或抛出 FooException”的注释 -
返回本地对象的指针也是无稽之谈。我认为“创建”这个词通常意味着在堆上新建一个对象。
-
我建议返回一个
new'd 对象,并说期望调用者之后执行delete &m;是不好的设计(但期望他们执行delete m;是可以的)。跨度>
标签: c++ pointers reference nullptr