考虑以下代码:

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,依靠 返回值优化 消除复制对象的成本。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top