5

要素へのポインタを取得して、QVectorそのオブジェクトを他の場所で使用できるようにしたいと思いますが、at()メソッドは値を与え、はconst T&値をoperator[]与えT&ます。

コピーコンストラクターを使用する代わりに同じオブジェクトを使用するように、これらを使用してポインターを取得する方法について混乱しています。

4

2 に答える 2

12

値はコピーでT&はなく、参照です。

参照はポインタによく似ています。参照は軽く、基になるオブジェクトを変更するために使用できます。ただ、直接オブジェクトと同じ構文(矢印の代わりにドットを使用)でそれらを使用し、記事で確認したい他のいくつかの違いを使用します。

現在ベクター内にあるオブジェクトを編集するには、たとえばを使用できますvector[i].action();。これにより、コピーではなく、ベクター内のオブジェクトからaction()メソッドが呼び出されます。他の関数への参照を渡すこともできます(それらが参照引数を取る場合)、それらは引き続き同じオブジェクトを指します。

参照からオブジェクトのアドレスを取得することもできます:Object* pObject = & vector[i];そしてそれを任意のポインタとして使用できます。

オブジェクトへのポインタが本当に必要な場合は、ポインタのベクトルを使用することもできます。QVector<Object*> vector; ただし、これには、オブジェクトのベクトルでは必要のない作成/破棄を処理する必要があります。

ここで、Vector自体へのポインターが必要な場合は、次のようにします。QVector<Object> *pVector = &vector;

于 2012-05-19T12:27:50.593 に答える
3

QVector::operator[]指定されたインデックスの要素への参照を返します。参照がconst参照でない場合、参照は変更可能です。これは。によって返されQVector::at()ます。

次の例のように、新しい値を割り当てるか、オブジェクトの変更メンバーを使用することで、要素を簡単に変更できます。

// vector of primitive types:
QVector<int> vector;
vector.append(3);
vector.append(5);
vector.append(7);
vector[0] = 2;   // vector[0] is now 2
vector[1]++;     // vector[1] is now 6
vector[2] -= 4;  // vector[2] is now 3

// vector of objects:
QVector<QString> strings;
strings.append(QString("test"));
strings[0].append("ing"); // strings[0] is now "testing"

QMapまた、存在しないキーのQHashサポートもあります。これにより、次のことが可能になります。operator[]

QMap<int, int> map;
map[0] = 4;
map[3] = 5;

の欠点の1つoperator[]は、エントリが以前に存在していなかった場合に作成されることです。

// before: map contains entries with key 0 and 3
int myEntry = map[2]; // myEntry is now 0
// after: map contains entries with keys 0, 2 and 3
于 2012-05-19T15:23:59.030 に答える