C ++ - for循环中没有正确设置值

时间:2012-03-20 12:49:14

标签: c++ loops setvalue

我正在尝试在三角形的三个对象上设置第二和第三个角的值。如果明确地完成,这看起来像这样:

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; }

2 个答案:

答案 0 :(得分:5)

你的问题存在:

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

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

答案 1 :(得分:1)

我改变了:

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];