Question

Considérez le code suivant:

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

Comment puis-je Évitez d'avoir un Qstring vide sans modifier le type de retour de la méthode? (Il semble que le retour d'un QString vide alloué à la pile est une mauvaise idée)

Merci.

Était-ce utile?

La solution

Vous ne pouvez pas. Soit ne renvoyez pas de référence const ou utilisez une variable statique locale comme celle-ci:

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

L'avantage de cette méthode par rapport aux autres méthodes proposées est que cette solution ne nécessite pas de changement à l'interface de MyClass. De plus, l'utilisation d'un paramètre par défaut peut confondre les utilisateurs de votre classe et conduire à une mauvaise utilisation de classe. Cette solution est transparente pour l'utilisateur.

Au fait, utilisez-vous vraiment un tableau de style C dans votre classe?

Autres conseils

Puisque cela devrait retourner un const Valeur Je ne vois aucun problème à avoir un QString vide global (ou statique) qui est utilisé par toutes ces fonctions pour renvoyer une chaîne vide.

Mais je ne suis pas sauvage sur le nom. Je m'attendrais à ce que le Qstring "vide" soit un membre constant const de la classe QString. Donc, votre code ressemblerait à ceci à la place.

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

Vous ne pouvez pas l'éviter sans modifier le type de retour.

Si vous choisissez de retourner une référence, alors vous devoir avoir une variable du type de retour qui surmonte la portée de la fonction. Si vous ne pouvez pas modifier l'API (par exemple en raison de promesses de compatibilité binaire), vous êtes enfermé pour toujours. Vous devrez gaspiller la mémoire stockant une valeur de la valeur du type pertinent, même si vous modifiez le reste de votre mise en œuvre de classe pour générer les valeurs à la volée ou les récupérer à partir d'une source externe.

C'est pourquoi les guides de conception d'API C ++ qui sont conscients des problèmes de compatibilité binaire recommandent de ne pas retourner const& sans considération attentive.

Que diriez-vous d'utiliser une valeur par défaut pré-initialisée:

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 vous insistez pour retourner une référence, vous devez avoir un objet à laquelle vous référer; Vous devez donc avoir l'objet QString quelque part dans votre exemple, il n'y a aucun moyen de le contourner.

Cependant, une technique qui semble adaptée à votre cas est de modifier votre méthode pour accepter un ID par défaut pour revenir au cas où l'index est hors de portée:

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

Vous pouvez également lancer une exception si l'index est hors de portée, alors vous n'auriez pas besoin de revenir en échec, mais ce n'est probablement pas ce que vous voulez.

Qstring :: null suffirait-il?

You cannot avoid the need for an empty QString without changing the way getId() works. But there are two approaches that spring to mind:

  • instead of silently returning an empty string, throw an exception; or
  • don't bother about returning a reference, and just return a QString, relying on return value optimization to eliminate the cost of copying the object.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top