Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;参考向量问题?_C++_Pointers_Vector_Reference - Fatal编程技术网

C++ c++;参考向量问题?

C++ c++;参考向量问题?,c++,pointers,vector,reference,C++,Pointers,Vector,Reference,当我把对向量的引用作为参数传递时,我遇到了一些困难。最初,它是指向指针向量的指针,调用的函数将更改obejct调用它的任何对象的属性。例如,我使用: (*myVector)[i]->myFunction(); 一切都很顺利。myFunction()将转换myVector当前索引中的任何对象 现在我改变了向量来保存一组对象,而不是像最初那样指向对象的指针。我传递的不是指向向量的指针,而是向量的引用。我按如下方式访问该功能: myVector[i].myFunction(); 在编译之后,

当我把对向量的引用作为参数传递时,我遇到了一些困难。最初,它是指向指针向量的指针,调用的函数将更改obejct调用它的任何对象的属性。例如,我使用:

(*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数组代码时),我将把一个大的具体类放入一个按值向量中,并小心过早的优化。回答得好。我会的