我用C ++编写了一个SDL图形程序(它大约有300行,所以我将尝试总结)。该计划涉及Springs和Vertices,两者都是类。 Springs以胡克(Hookean)的方式对其两个Vertices施加一股力量。
这是初始化三个顶点和两个弹簧的代码。 S1
和S2
是弹簧,V1
,V2
和V3
是顶点。
//Initialize vertices
Vertex V1;
V1.pos.x = 100;
V1.pos.y = 300;
Vertex V2;
V2.pos.x = 200;
V2.pos.y = 200;
Vertex V3;
V3.pos.x = 300;
V3.pos.y = 100;
//Initialize springs
Spring S1;
S1.p0 = V1;
S1.p1 = V2;
Spring S2;
S2.p0 = V2;
S2.p1 = V3;
意图是V2
连接到S1
和S2
,并且两个弹簧通过此顶点相互连接。真正发生的是通过编写S2.p0 = V2;
,创建了V2的副本。我做了这个例子来澄清。
所以我的问题是:我如何编辑上面的代码以便获得预期的结果?也就是说,如何将p0
和p1
分配给弹簧,以便它们引用原始对象?基本上,我尝试将引用分配给V2
,而不是V2
的副本。我该怎么做?
答案 0 :(得分:4)
将Spring
的定义更改为存储Vertex
指针或引用。指针将为您提供更大的灵活性,可以移动弹簧并连接到不同的顶点:
struct Spring {
Vertex* p0;
Vertex* p1;
};
然后将它们设置为:
Spring S1;
S1.p0 = &V1;
S1.p1 = &V2;
答案 1 :(得分:2)
看起来你的类Spring存储了一个像
一样的顶点class Spring {
public:
Vertex p0, p1;
}
但是你希望Spring存储对Vertex的引用,如
class Spring {
public:
Vertex &p0, &p1;
}
使用引用作为类成员意味着Spring需要一个构造函数来初始化p0和p1:
Spring(Vertex &v1, Vertex &v2) : p0(v0), p1(v1) {}
你需要将你的Spring创作重写为
Spring S1(V1, V2);
您需要确保V1的寿命至少与S1一样长,以使引用保持有效。
当然,如果引用,Spring也可以存储指向Vertex的指针。指针可以在以后更改,而引用只能在构造期间设置。