【问题标题】:C++ - values not getting set correctly in for loopC++ - 在 for 循环中未正确设置值
【发布时间】:2012-03-20 12:49:13
【问题描述】:

我正在尝试为三角形类的三个对象设置第二个和第三个角的值。如果显式完成,则如下所示:

triangle_mesh[0].set_vector_point2(vector_anchors[1]);
triangle_mesh[1].set_vector_point3(vector_anchors[1]);
triangle_mesh[1].set_vector_point2(vector_anchors[2]);
triangle_mesh[2].set_vector_point3(vector_anchors[2]);
triangle_mesh[2].set_vector_point2(vector_anchors[3]);
triangle_mesh[0].set_vector_point3(vector_anchors[3]);

工作!打印这些三角形,我得到(n.b. 第一个角已经设置 - 这不是问题):

triangle0 is ( 0, 0, -1) (1, 0, 0) (-0.5, -0.866025, 0)
triangle1 is ( 0, 0, -1) (-0.5, 0.866025, 0) (1, 0, 0)
triangle2 is ( 0, 0, -1) (-0.5, -0.866025, 0) (-0.5, 0.866025, 0)

不过,首先,这很难看,其次,它必须推广到我要设置三个以上三角形的情况。我的代码是:

for (int longitude = 0; longitude < num_longitudes; longitude++){
  SurfaceVector current_anchor = vector_anchors[1 + longitude];
    triangle_mesh[longitude].set_vector_point2(current_anchor);
    triangle_mesh[(longitude + 1) % num_longitudes].set_vector_point3(current_anchor);
}

*n.b. num_longitudes 是 3*

我已经检查了 一切我能想到的,但是现在当我打印出我的三角形时,我得到了:

triangle0 is ( 0, 0, -1) (-0.5, -0.866025, 0) (-0.5, -0.866025, 0)
triangle1 is ( 0, 0, -1) (-0.5, -0.866025, 0) (-0.5, -0.866025, 0)
triangle2 is ( 0, 0, -1) (-0.5, -0.866025, 0) (-0.5, -0.866025, 0)

有人知道可能出了什么问题吗?!

编辑

三角形上的vector_point变量是指针,设置如下:

void set_vector_point1(SurfaceVector vector_point) { vector_point1 = &vector_point; }

【问题讨论】:

    标签: c++ loops setvalue


    【解决方案1】:

    这就是你的问题:

    void set_vector_point1(SurfaceVector vector_point) { vector_point1 = &vector_point; }
    

    您指向一个临时对象(函数调用完成后,vector_point 将不复存在)。更改它以便正确复制SurfaceVector

    【讨论】:

    • 啊,这是有道理的。但我确实希望我的三角形的指针指向与 vector_anchors 向量相同的内存位置,而不是它的副本(两者在我的程序中都存在同样长的时间,所以我不想浪费内存存储两次)。
    • @tiswas,然后考虑使用一些智能指针——比如boost::shared_ptr...
    • 嗯,我可以不只是按照@maitu 建议的那样做,而是直接传递vector_anchors 的元素,而不是通过中介 current_anchor..?
    • @tiswas,我不推荐它,如果外部向量调整大小(如果添加另一个元素),你所有的指针都会悬空..
    【解决方案2】:

    我会改变:

    void set_vector_point1(SurfaceVector vector_point) { vector_point1 = &vector_point; }
    

    void set_vector_point1(SurfaceVector& vector_point) { vector_point1 = &vector_point; }
    

    或者类似的东西。

    在当前版本中,vector_point 将是您传递的任何内容的副本,并且在之后将不再存在,您正在存储一个指向不再存在的对象的指针。

    在第二个中,vector_point 是对函数外部寿命更长的对象的引用。存储指向它的指针很好,因为当您使用指针时对象仍然存在。

    诀窍是确保对象的寿命比所有指向它的指针长。

    补充:

    在下面的评论中感谢@Nim:

    同样在for循环所在的行:

    SurfaceVector current_anchor = vector_anchors[1 + longitude];
    

    这也应该是一个参考......目前它也是一个副本。这样,您将编辑数组中的实际对象,而不是玩弄副本并将它们扔掉。所以我会将该行更改为:

    SurfaceVector& current_anchor = vector_anchors[1 + longitude];
    

    【讨论】:

    • 仍然无济于事,他传入的东西(您已将其更改为引用)在 for 循环内是局部范围的,一旦退出循环,它就是一个悬空指针。 .
    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 2021-05-23
    • 2012-03-15
    • 2012-08-29
    • 2015-10-03
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多