2011-10-12 68 views
4

在下面的代码段的两个** meaninings一个迭代器

vector<SceneObject *> sceneObjs; 
vector<SceneObject *>::iterator iter; 

iter = sceneObjs.begin(); 
while (iter != sceneObjs.end()){ 
    cout << **iter <<endl; 
    iter++; 
} 

为什么** ITER有两个* S?

回答

12

第一个*取消引用迭代器,给出SceneObject *指针。第二个*将这个SceneObject *指针解除引用到SceneObject本身。

11

因为*iterSceneObject *&-a SceneObject指针。您需要解除引用才能得到真实的SceneObject

+2

Ssh,不要告诉任何人,但'* iter'实际上是一个'SceneObject *&',但它并没有改变这里的其余部分。 –

+1

@ R.MartinhoFernandes我真的不知道C++是否足够了,但我会将其纳入答案中,谢谢! – cnicutar

+1

@cnicutar在这种情况下,参考部分没有任何区别。该引用使得使用迭代器的代码可以更改迭代器的内容(迭代器的指针,而不是迭代器内的指针指向的内存)。当你调用一个函数时,这个引用也很重要,它本身需要一个'SceneObject *&'引用,因为这个函数可以将* it的内容替换为另一个值。当你有一个函数'void setNull(SceneObject *&obj){obj = NULL;}'时,比调用'setNull(* iter);'设置迭代器的内容为NULL。 – Rudi

5

因为*iter返回SceneObject*,然后它将再次被第二个*解除引用。

3

第一个*返回迭代器中的值,SceneObject*指针。第二个*推断那个指针,给出一个SceneObject。我怀疑<<有一个过载,它将SceneObject`呈现给一个流。