kbi*_*irk 3 c++ pointers reference vector
在将向量作为参数传递时,我遇到了一些困难.最初它是一个指针向量的指针,被调用的函数会改变任何obejct调用它的属性.例如,我用过:
(*myVector)[i]->myFunction();
Run Code Online (Sandbox Code Playgroud)
一切都很完美.myFunction()会将任何对象转换为myVector的当前索引.
现在我已经改变了向量来保存一组对象而不是像最初那样指向对象的指针.我没有将指针传递给向量,而是传递了它的引用.我按如下方式访问该函数:
myVector[i].myFunction();
Run Code Online (Sandbox Code Playgroud)
它编译,我发现myFunction()不再具有与之前相同的结果.我使用断点并看到它本来应该更改属性,但是,这些更改从未进入原始对象.即使断点显示myVector [i]的来源发生了变化,也没有最终的翻译.
我已经尝试将指针传递给对象向量并使用:
(*myVector)[i].myFunction();
Run Code Online (Sandbox Code Playgroud)
同样的事情,它编译但没有奏效.
最后我尝试简单地将一个引用传递给向量中的第一个对象,当然这很好用:
myObject.myFunction();
Run Code Online (Sandbox Code Playgroud)
关于向量的引用是否存在一些固有的东西?为什么指向指针向量的指针有效,但对对象向量的引用不起作用?传递的矢量不应该是原始矢量的别名吗?为什么引用显示更改但不引用它引用的对象?
除非我使用指针向量而不是对象向量,否则为什么我的更改不会坚持下去.
坚持一分钟.当您更改此代码段时:
(*myVector)[i]->myFunction()
Run Code Online (Sandbox Code Playgroud)
对此:
myVector[i].myFunction()
Run Code Online (Sandbox Code Playgroud)
你实际上改变了两件事:
myVector 从指针到参考;myVector从指针变为简单值类型.如果你改变了元素的类型,以一个简单的值类型(在std::vector<int*>来std::vector<int>),然后当你将它们添加到您的载体,它们被复制到它.(向量传递的方式,即通过指针或引用,不会影响此行为.向量传递的方式以及向量内传递对象的方式是完全独立的.)这意味着每当你对它们进行了更改,只更改了向量中的版本.
使用保存指针的向量没有任何问题(只要你以合理的方式进行内存管理).如果您希望将向量中的版本更改复制到原始版本,则必须使用引用或指针.因为有一个向量包含引用(如在std::vector<int&>)中是一个痛苦的世界,如果可能的话,你可能更喜欢指针.