0

このクラスがあるとしましょう:

class Bear
{
public:
    Bear ();
    Bear (Bear &other);

    // ... methods

private:
    BearInfo* m_pInfo;
};

BearオブジェクトをQList<Bear> by valueに格納できますか? ドキュメントによると:

内部的にQList<T>は、 type の項目へのポインターの配列として表されますT。それT自体がポインター型またはポインター以下の基本型である場合、またはTQt の共有クラスの 1 つである場合はQList<T>、アイテムをポインター配列に直接格納します。

私のクラスはポインターだけで構成されていますが、それはポインター型でも基本型QListでもないため、ポインター ( ) を格納するように見えますがBear*、これは私が望んでいるものではありません。また、構造は変更可能でなければならないため、 からBearInfo派生することはできません。BearQSharedDataPointer

このクラスをQt コレクションにで格納できるようにする方法について何か提案はありますか?

4

3 に答える 3

2

QVectorを使用してください。Qt ドキュメントには次のように記載されています。

QList、QLinkedList、および QVarLengthArray は同様の機能を提供します。概要は次のとおりです。

  • ほとんどの場合、QList が適切なクラスです。prepend() や insert() などの操作は、通常、QList がアイテムをメモリに格納する方法 (詳細についてはアルゴリズムの複雑さを参照) により QVector よりも高速であり、そのインデックス ベースの API は QLinkedList の反復子ベースの API よりも便利です。また、実行可能ファイル内のコードが少なくなります。
  • リストの途中での一定時間の挿入と、インデックスではなくアイテムへのイテレータを保証する、実際のリンクされたリストが必要な場合は、QLinkedList を使用します。
  • アイテムが隣接するメモリ位置を占めるようにする場合、またはアイテムがポインターよりも大きく、挿入時にヒープに個別に割り当てるオーバーヘッドを避けたい場合は、QVector を使用します。
  • 低レベルの可変サイズ配列が必要な場合は、QVarLengthArray で十分な場合があります。
于 2011-06-01T21:18:13.817 に答える
2

stl コンテナーを使用するだけで、QT でもどこでも使用できます。

それは私がすることです。:)

于 2011-06-01T21:08:04.453 に答える
2

Bear オブジェクトを QList<Bear>値渡しで保存できますか?

いいえ 。ドキュメントからの引用は正しかったQList<T>ですT

代わりに、QVectorポインタより大きい型の値でオブジェクトを格納する を使用します (それが目的です)。

のアイテムに関する同様の問題は、プリミティブ型またはその他の小さな型 ( など) を保持するQList<>による包含に関する問題です。したがって、値がプリミティブまたはポインターに適合する場合にのみ、値のセマンティクスを取得します。QVariantQDateQVariant

QPointerまたはインスタンスのようなオブジェクトのコンテナーがあれば、完全な封じ込めが達成されQSharedPointerます。これは、(参照カウントされた) オブジェクトへの参照を論理的に共有および追跡します。

STL (値セマンティクスを使用) とは異なり、Qt は「アイテムへのポインター」のコンテナーに依存しています。これは、これらのアイテムがポリモーフィック (派生クラスでサイズが異なる) である場合の問題があるためです。(これは、オブジェクト指向システムでは非常に一般的であり、Qt がデフォルトでポインター セマンティクスを使用する理由です。)

たとえば、Qt では問題ありません (インスタンスQList<Bear>へのポインターのコンテナーとして実装されBearます) が、std::list<Bear>すべての Bear インスタンスが同じサイズでない場合 (たとえば、 ifKodiakBearBlackBearから派生しBear、それらの派生インスタンスを追加した場合) は問題になります。std::list<Bear>クラスに)。その場合、導出された状態は、値のセマンティクスによって「削除」されます。

于 2011-06-01T21:25:30.460 に答える