Как вернуть справочник Const QString в случае сбоя?

StackOverflow https://stackoverflow.com/questions/2352683

  •  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 Значение Я не вижу проблем с наличием глобального (или статического константного) пустого QString, который используется всеми такими функциями, чтобы вернуть пустую строку.

Я не дикий в отношении имени, хотя. Я ожидаю, что «пустое» Qstring станет статическим членом CONST класса QString. Так что ваш код будет выглядеть так.

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 (например, из -за обещаний бинарной совместимости), то вы навсегда заблокированы. Вам придется тратить память, сохраняя какое -то значение соответствующего типа, даже если вы измените оставшуюся часть реализации класса, например, генерировать значения на лету или получить их из какого -то внешнего источника.

Вот почему руководства по дизайну API C ++, которые знают о проблемах бинарной совместимости, рекомендуют не возвращать 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 где -то в вашем примере, нет никакого способа обойти его.

Однако методика, которая кажется подходящей для вашего случая, состоит в том, чтобы изменить ваш метод, чтобы принять идентификатор по умолчанию для возврата в случае, если индекс не в диапазоне:

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

Вы также можете сделать исключение, если индекс вышел из диапазона, тогда вам не нужно будет на самом деле возвращать неудачу, но это, вероятно, не то, что вы хотите.

Будет ли Qstring :: null достаточно?

Вы не можете избежать необходимости пустого QString, не изменяя путь getId() работает. Но есть два подхода, которые приходят на ум:

  • Вместо того, чтобы молча вернуть пустую строку, бросьте исключение; или же
  • Не беспокойтесь о возвращении ссылки и просто возвращайте Qstring, полагаясь на Оптимизация возврата значения устранить стоимость копирования объекта.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top