C++ c++;参考向量问题?
当我把对向量的引用作为参数传递时,我遇到了一些困难。最初,它是指向指针向量的指针,调用的函数将更改obejct调用它的任何对象的属性。例如,我使用:C++ c++;参考向量问题?,c++,pointers,vector,reference,C++,Pointers,Vector,Reference,当我把对向量的引用作为参数传递时,我遇到了一些困难。最初,它是指向指针向量的指针,调用的函数将更改obejct调用它的任何对象的属性。例如,我使用: (*myVector)[i]->myFunction(); 一切都很顺利。myFunction()将转换myVector当前索引中的任何对象 现在我改变了向量来保存一组对象,而不是像最初那样指向对象的指针。我传递的不是指向向量的指针,而是向量的引用。我按如下方式访问该功能: myVector[i].myFunction(); 在编译之后,
(*myVector)[i]->myFunction();
一切都很顺利。myFunction()将转换myVector当前索引中的任何对象
现在我改变了向量来保存一组对象,而不是像最初那样指向对象的指针。我传递的不是指向向量的指针,而是向量的引用。我按如下方式访问该功能:
myVector[i].myFunction();
在编译之后,我发现myFunction()的结果不再像以前一样。我使用了一个断点,看到它正在更改它应该更改的属性,但是,这些更改从未对原始对象进行过更改。即使断点显示myVector[i]的原点已更改,也没有最终的转换
我尝试传递指向对象向量的指针,并使用:
(*myVector)[i].myFunction();
同样的,它编译了,但不起作用
最后,我尝试简单地传递对向量中第一个对象的引用,当然,这很好:
myObject.myFunction();
关于向量的引用,我缺少了一些固有的东西吗?为什么指向指针向量的指针有效,而指向对象向量的引用无效?传递的向量不应该是原始向量的别名吗?为什么引用显示的是更改,而不是它引用的对象
除非我使用指针向量而不是对象向量,否则为什么我的更改不会保持不变。如果您的更改没有使其成为“原始”对象,那么听起来好像您在某处传递了值。这里有一些想法。也许你可以发布更多的代码
在这里,传递指向向量的指针或对向量的引用都不重要。从概念上讲,它们是不同的(引用不能为null),但在实现中它们都是指向向量的指针,并且向量不是按值传递的。问题与您是否持有指向向量的指针或引用无关。它与向量包含的内容有关。如果向量包含指针,那么当您更改向量中指向的对象时,相同对象的任何其他指针或引用也将受到影响。但是,如果向量包含对象(按值),则在插入时复制对象,并且向量内部的更改在外部看不到,反之亦然
这是指针和引用的基本性质——如果它没有意义,你应该在C++上寻找一本体面的书。
< P>当一个向量存储对象时,它存储了传入的原始对象的副本。所以当你这样做的时候yourClass yourObj;
std::vector<yourClass> yourVector;
yourvector.push_back(yourObj);
yourvector[0].myFunction();
yourClass yourObj;
std::矢量;
yourvector.push_back(yourObj);
yourvector[0].myFunction();
只有位于向量[0]的对象会更改,因为它是原始对象的副本。请稍候。更改此代码段时:
(*myVector)[i]->myFunction()
为此:
myVector[i].myFunction()
你实际上改变了两件事:
myVector
从指针转到引用李>
myVector
中的元素类型从指针变为简单值类型std::vector
更改为std::vector
),则将它们添加到向量中时,会将它们复制到向量中。(向量的传递方式,即通过指针或引用,并不影响此行为。向量的传递方式和向量内对象的传递方式完全独立。)这意味着,无论何时对它们进行更改,都只更改向量内的版本
使用包含指针的向量没有错(只要您以合理的方式进行内存管理)。如果您希望将对向量中的版本所做的更改复制到原始版本,则必须使用引用或指针。由于向量包含引用(如
std::vector
)是一个痛苦的世界,如果可能的话,您可能更喜欢指针。对向量的引用没有什么特别之处。问题可能在别处。你能发布一些更完整的代码,以便我们了解一些上下文吗?啊,谢谢大家,这很有意义,我不知道我怎么会错过了。如果答案对你有效,你可能希望将答案标记为“已接受”(通过单击复选标记)。我自己的非正式测试(很久以前在Solaris上完成)显示了在向量中使用智能指针而不是对象时,应该在对象大约为40字节时使用智能指针(当然,如果它们具有非平凡的复制/分配语义)。当然,如果是一个只有一个字段的日期,那么只存储日期会更有效,但对于DateTimeRange对象这样的对象可能也是如此,它可能有一些简单的字段。是的,完美的优化有一些边界,但它将是一个移动的目标。如果向量本质上是一个静态数组(特别是在重写旧的C数组代码时),我将把一个大的具体类放入一个按值向量中,并小心过早的优化。回答得好。我会的