Frage

Betrachten Sie den folgenden Code:

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

Wie kann ich Vermeiden Sie es, ein leeres QString zu haben Ohne den Rückgabetyp der Methode zu ändern? (Es scheint, dass die Rückgabe eines leeren Qstring, der auf dem Stapel zugewiesen wurde, eine schlechte Idee ist)

Vielen Dank.

War es hilfreich?

Lösung

Du kannst nicht. Entweder geben Sie keine CONT -Referenz zurück oder verwenden Sie keine lokale statische Variable wie folgt:

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

Der Vorteil dieser Methode gegenüber den anderen vorgeschlagenen Methoden besteht darin, dass diese Lösung keine Änderung der Schnittstelle von erfordert MyClass. Darüber hinaus kann die Verwendung eines Standardparameters Benutzer Ihrer Klasse verwirren und zu einer falschen Klassennutzung führen. Diese Lösung ist für den Benutzer transparent.

Verwenden Sie übrigens wirklich ein C -Stil -Array in Ihrer Klasse?

Andere Tipps

Da es erwartet wird, dass dies a zurückkommt const Wert Ich sehe kein Problem mit einer globalen (oder statischen konstanten) leeren QString, die von all diesen Funktionen verwendet wird, um eine leere Zeichenfolge zurückzugeben.

Ich bin allerdings nicht wild über den Namen. Ich würde erwarten, dass das "leere" Qstring ein statisches Konstantiktor der Qstring -Klasse wäre. Ihr Code würde also stattdessen so aussehen.

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

You can't avoid it without changing the return type.

If you choose to return a reference, then you must have some variable of the return type which outlives the function's scope. If you can't change the API (e.g. due to binary compatibility promises), then you are locked in to this forever. You'll have to waste memory storing some value of the relevant type, even if you change the rest of your class implementation to e.g. generate the values on the fly or retrieve them from some external source.

This is why C++ API design guides which are aware of binary compatibility issues recommend to not return a const& without careful consideration.

Wie wäre es mit einem vorinitialisierten Standardwert:

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

Wenn Sie auf der Rückgabe einer Referenz bestehen, müssen Sie ein Objekt haben, auf das Sie sich beziehen müssen. Sie müssen also das QString -Objekt irgendwo in Ihrem Beispiel haben, es gibt keinen Weg.

Eine Technik, die für Ihren Fall geeignet erscheint, besteht jedoch darin, Ihre Methode zu ändern, um eine Standard -ID zu akzeptieren, falls der Index außerhalb des Bereichs liegt:

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

Sie können auch eine Ausnahme auslegen, wenn der Index außerhalb der Reichweite ist, dann müssten Sie nicht tatsächlich ein Misserfolg zurückbringen, aber das ist wahrscheinlich nicht das, was Sie wollen.

Würde Qstring :: null ausreichen?

Sie können die Notwendigkeit eines leeren Qstring nicht vermeiden, ohne den Weg zu ändern getId() Arbeiten. Aber es gibt zwei Ansätze, die sich in den Sinn kämpfen:

  • Werfen Sie eine Ausnahme aus, anstatt eine leere Saite stillschweigend zurückzugeben. oder
  • Machen Sie sich nicht darum Rückgabewertoptimierung Um die Kosten für das Kopieren des Objekts zu beseitigen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top