在失败的情况下,如何返回const QString参考?
-
23-09-2019 - |
题
考虑以下代码:
const QString& MyClass::getID(int index) const
{
if (i < myArraySize && myArray[i]) {
return myArray[i]->id; // id is a QString
} else {
return my_global_empty_qstring; // is a global empty QString
}
}
我怎样才能 避免有一个空的QString 不更改该方法的返回类型? (似乎返回在堆栈上分配的空QString是一个坏主意)
谢谢。
解决方案
你不能。要么不返回常量参考,要么使用这样的局部静态变量:
const QString& MyClass::getID(int index) const {
if (i < myArraySize && (myArray[i] != 0)) {
return myArray[i]->id; // id is a QString
}
static const QString emptyString;
return emptyString;
}
该方法比其他提出的方法的优点是,该解决方案不需要更改对接口 MyClass
. 。此外,使用默认参数可能会使您的类的用户感到困惑,并导致错误的类使用。该解决方案对用户透明。
顺便说一句,您真的在班上使用C样式数组吗?
其他提示
因为这预计将返回 const
值我认为拥有所有此类功能返回一个空字符串的全局(或静态const)空的QString没有问题。
我对这个名字并不疯狂。我希望“空” QString将是QString类的静态const成员。因此,您的代码看起来像这样。
const QString& MyClass::getID(int index) const
{
if (i < myArraySize && myArray[i]) {
return myArray[i]->id; // id is a QString
} else {
return QString::EmptyString; // is a global empty QString
}
}
如果不更改返回类型,您无法避免它。
如果您选择返回参考,那么您 必须 具有返回类型的一些变量,该变量超出了函数的范围。如果您无法更改API(例如,由于二进制兼容性承诺,您将永远锁定在此。即使您更改了类实现的其余部分,例如即时生成值或从某些外部来源检索它们,您也必须浪费内存存储相关类型的某些值。
这就是为什么意识到二进制兼容性问题建议不返回的C ++ API设计指南 const&
没有仔细考虑。
如何使用预启动默认值:
const QString& MyClass::getID(int index, const QString& def = QString()) const
{
if (i < myArraySize && myArray[index]) {
return myArray[index]->id; // id is a QString
} else {
return def;
}
}
如果您坚持返回参考,则必须有一个对象。因此,您必须将QString对象放在示例中的某个地方,因此无法解决。
但是,似乎适合您案例的技术是更改您的方法以接受默认ID以返回,以防该索引超出范围:
const QString& MyClass::getID( int i, const QString& default ) const
{
if( i < myArraySize && myArray[i] )
return myArray[i]->id;
else
return default;
}
如果索引超出范围,您也可能会引发异常,那么您无需实际返回失败,但这可能不是您想要的。
QString ::无需足够吗?
您无法避免在不改变方式的情况下需要空的QString getId()
作品。但是,有两种方法引起了人们的注意:
- 而不是默默地返回一个空字符串,而是抛出异常。或者
- 不要费心返回参考,只是返回QString,依靠 返回值优化 消除复制对象的成本。