質問

次のコードを検討してください。

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 Referenceを返さないか、次のようなローカル静的変数を使用しないでください。

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スタイルアレイを使用していますか?

他のヒント

これはaを返すと予想されるため const 値私は、空の文字列を返すためにそのようなすべての関数によって使用されるグローバルな(または静的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
    }
}

返品タイプを変更せずに避けることはできません。

参照を返すことを選択した場合、あなたは しなければならない 関数の範囲の範囲を上回るリターンタイプの変数を持っています。 APIを変更できない場合(たとえば、バイナリ互換性の約束により)、これに永遠にロックされています。クラスの実装の残りを変更して、たとえばその場で値を生成したり、外部ソースから取得したりしても、関連するタイプの価値を保存するメモリを無駄にする必要があります。

これが、バイナリの互換性の問題を認識しているC ++ APIデザインガイドを返しないことを推奨する理由です 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オブジェクトを持っている必要があります。それを回避する方法はありません。

ただし、ケースに適していると思われる手法は、インデックスが範囲外の場合に備えて、デフォルトIDを受け入れるようにデフォルトIDを受け入れるようにすることです。

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() 作品。しかし、頭に浮かぶ2つのアプローチがあります。

  • 静かに空の文字列を返す代わりに、例外を投げます。また
  • 参照を返すことを気にせず、QSTRINGを返してください。 返品値の最適化 オブジェクトをコピーするコストを削除するため。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top