8

考虑以下代码:

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 是个坏主意)

谢谢。

4

7 回答 7

8

你不能。要么不返回 const 引用,要么使用像这样的局部静态变量:

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 风格的数组吗?

于 2010-02-28T22:20:05.037 回答
3

由于预计这将返回一个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
    }
}
于 2010-02-28T21:21:19.120 回答
2

如果不更改返回类型,就无法避免它。

如果您选择返回一个引用,那么您必须有一些返回类型的变量超出函数的范围。如果您无法更改 API(例如,由于二进制兼容性承诺),那么您将永远被锁定。您将不得不浪费内存来存储相关类型的某些值,即使您将类实现的其余部分更改为例如动态生成值或从某个外部源检索它们。

这就是为什么知道二进制兼容性问题的 C++ API 设计指南建议不要在const&没有仔细考虑的情况下返回 a。

于 2010-02-28T22:33:53.600 回答
0

如何使用预初始化的默认值:

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;
    }
}
于 2010-02-28T21:22:27.107 回答
0

如果你坚持要返回一个引用,你必须有一个对象可以引用;所以你必须在你的例子中的某个地方有 QString 对象,没有办法绕过它。

但是,似乎适合您的情况的一种技术是更改您的方法以接受默认 ID,以防索引超出范围:

const QString& MyClass::getID( int i, const QString& default ) const
{
  if( i < myArraySize && myArray[i] )
    return myArray[i]->id;
  else
    return default;
}

如果索引超出范围,您也可以抛出异常,那么您实际上不需要在失败时返回,但这可能不是您想要的。

于 2010-02-28T21:23:54.937 回答
0

QString::null 就足够了吗?

于 2010-04-30T04:17:06.907 回答
0

在不改变工作方式的情况下,您无法避免对空 QString 的需求getId()。但是有两种方法浮现在脑海中:

  • 不是默默地返回一个空字符串,而是抛出一个异常;或者
  • 不用费心返回引用,只返回一个QString,依靠返回值优化来消除复制对象的成本。
于 2010-04-30T04:34:13.113 回答