Pregunta

Considere el siguiente código:

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
    }
}

Cómo puedo Evite tener un QString vacío sin cambiar el tipo de retorno del método? (Parece que devolver un QString vacío asignado en la pila es una mala idea)

Gracias.

¿Fue útil?

Solución

No puedes. No devuelva una referencia const o use una variable estática local como esta:

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;
}

La ventaja de este método sobre los otros métodos propuestos es que esta solución no requiere un cambio en la interfaz de MyClass. Además, el uso de un parámetro predeterminado puede confundir a los usuarios de su clase y conducir al uso de clase incorrecto. Esta solución es transparente para el usuario.

Por cierto, ¿realmente estás usando una matriz de estilo C en tu clase?

Otros consejos

Dado que se espera que esto devuelva un const Valor No veo ningún problema con tener un QString vacío global (o estático) vacío que usa todas esas funciones para devolver una cadena vacía.

Sin embargo, no estoy salvaje sobre el nombre. Esperaría que el QString "vacío" fuera un miembro estático constante de la clase QString. Entonces su código se vería así.

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
    }
}

No puede evitarlo sin cambiar el tipo de retorno.

Si elige devolver una referencia, entonces deber Tenga una variable del tipo de retorno que sobrevive el alcance de la función. Si no puede cambiar la API (por ejemplo, debido a las promesas de compatibilidad binaria), entonces está encerrado en esto para siempre. Tendrá que desperdiciar memoria almacenando algún valor del tipo relevante, incluso si cambia el resto de la implementación de su clase a EG, genere los valores en la mosca o los recupere de alguna fuente externa.

Es por eso que las guías de diseño de API de C ++ que son conscientes de los problemas de compatibilidad binaria recomiendan no devolver un const& sin consideración cuidadosa.

¿Qué tal usar un valor predeterminado preinicializado:

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;
    }
}

Si insiste en devolver una referencia, debe tener un objeto para referirse; Por lo tanto, debe tener el objeto QString en algún lugar de su ejemplo, no hay forma de evitarlo.

Sin embargo, una técnica que parece adecuada para su caso es cambiar su método para aceptar una ID predeterminada para devolver en caso de que el índice esté fuera de rango:

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

También podría lanzar una excepción si el índice está fuera de rango, entonces no necesitaría volver a la falla, pero eso probablemente no sea lo que desea.

¿Será suficiente QString :: Null?

No puede evitar la necesidad de un QString vacío sin cambiar la forma getId() obras. Pero hay dos enfoques que vienen a la mente:

  • En lugar de devolver en silencio una cadena vacía, arroje una excepción; o
  • No se preocupe por devolver una referencia y simplemente devuelva un QString, confiando en Optimización del valor de retorno eliminar el costo de copiar el objeto.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top