5

我很想得到一个指向QVector元素的指针,这样我就可以在其他地方使用该对象,但是该at()方法给了我一个const T&值,并且operator[]给了我一个T&值。

我对如何使用这些来获取指针感到困惑,以便我将使用相同的对象而不是使用复制构造函数。

4

2 回答 2

12

T&不是副本,它是引用

引用看起来很像指针:它们很轻,可以用来修改底层对象。只是,您使用它们的语法与直接对象相同(使用点而不是箭头),以及您可能希望在文章中查看的其他一些差异。

要编辑当前在 Vector 中的对象,您可以使用例如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[] returns a reference to the element at the given index. A reference is modifiable if it isn't a const reference, what is returned by QVector::at().

You can simply modify the element by assigning a new value or using a modifying member of the object, like in the following examples:

// 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 and QHash even support operator[] for non-existing keys, which makes the folliowing possible:

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

One disadvantage of operator[] is that the entry gets created if it didn't exist before:

// 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 回答