0

私は c++ の初心者であり、オブジェクトへのポインターまたはオブジェクト自体をベクターに格納することに関するいくつかのトピックを既に読んでいます。実行時に多くのオブジェクトをプッシュバックしないため、オブジェクトをベクターに格納することにしました。ベクターは一度だけ作成され、このように残されます。

私の問題は、ベクトルを引数として取得し、渡されたベクトルで特定のオブジェクトを検索する別のオブジェクトがあることです。このオブジェクトが見つかった場合は、そのオブジェクトへのポインターが格納されます。見つからない場合は、変数が に設定されNULLます。

私は何もしていませんpush_backが、ポインターは他の関数の間違った場所を指しているようです。ベクター内の要素を検索するオブジェクトには、ポインターを返すパブリック関数があります。すべての関数呼び出しでオブジェクトを検索すると非常に遅くなるため、これはオプションではありません。 他の解決策はありますか、それともポインタのベクトルに切り替える必要がありますか?

いくつかのコード スニペット:

ベクターを検索するオブジェクトのコンストラクター:

MySearch::MySearch(QVector<Obj> objVector)
    :objVector(objVector) {
    found = NULL
    foreach(Obj o, this->objVector) {
        if(..found..) {
            found = &o;

            break;
        }
    }
}

ゲッター関数:

Obj* MySearch::getObject() {
    return found;
}
4

3 に答える 3

0

(Boost C++ ライブラリから) 使用する場合BOOST_FOREACHは、ベクトル内のオブジェクトへの非 const 参照を使用できます。 Q_FOREACH非 const 参照をサポートしていません:

BOOST_FOREACH(Obj& o, this->objVector) {
    if(..found..) {
        found = &o;

        break;
    }
}

または、反復子とforループを使用します。

于 2013-07-10T15:08:01.660 に答える
0
foreach(Obj o, this->objVector) {
    if(..found..) {
        found = &o;

        break;
    }
} // life time of o ends here.

oスタックに存在し、その寿命はループのみに制限されています。それを参照して後で返すと、未定義の動作が発生します。

于 2013-07-10T14:54:57.223 に答える