8

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

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 を返すのは悪い考えのようです)

ありがとう。

4

7 に答える 7

8

できません。const 参照を返さないか、次のようにローカル静的変数を使用しないでください。

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

于 2010-02-28T22:20:05.037 に答える
3

これは値を返すことが期待されるため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
    }
}
于 2010-02-28T21:21:19.120 に答える
2

戻り値の型を変更しないと回避できません。

参照を返すことを選択した場合は、関数のスコープを超える戻り型の変数が必要です。API を変更できない場合 (たとえば、バイナリ互換性が約束されているため)、これに永遠に縛られます。クラス実装の残りの部分を変更して、その場で値を生成したり、外部ソースから値を取得したりする場合でも、関連する型の値を格納するためにメモリを浪費する必要があります。

これが、バイナリ互換性の問題を認識している C++ API 設計ガイドが、const&慎重に検討せずに a を返さないことを推奨している理由です。

于 2010-02-28T22:33:53.600 に答える
0

事前に初期化されたデフォルト値を使用するのはどうですか?

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;
    }
}
于 2010-02-28T21:22:27.107 に答える
0

参照を返すことを主張する場合は、参照するオブジェクトが必要です。したがって、例のどこかにQStringオブジェクトが必要であり、それを回避する方法はありません。

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

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

インデックスが範囲外の場合に例外をスローすることもできます。そうすれば、実際に失敗時に戻る必要はありませんが、それはおそらくあなたが望むものではありません。

于 2010-02-28T21:23:54.937 に答える
0

動作方法を変更せずに、空の QString の必要性を回避することはできませんgetId()。しかし、頭に浮かぶ 2 つのアプローチがあります。

于 2010-04-30T04:34:13.113 に答える
0

QString::null で十分でしょうか?

于 2010-04-30T04:17:06.907 に答える