如何在C ++中通过引用分配类实例?

时间:2015-02-02 14:46:40

标签: c++ class reference sdl

我用C ++编写了一个SDL图形程序(它大约有300行,所以我将尝试总结)。该计划涉及Springs和Vertices,两者都是类。 Springs以胡克(Hookean)的方式对其两个Vertices施加一股力量。

这是初始化三个顶点和两个弹簧的代码。 S1S2是弹簧,V1V2V3是顶点。

    //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连接到S1S2,并且两个弹簧通过此顶点相互连接。真正发生的是通过编写S2.p0 = V2;,创建了V2的副本。我做了这个例子来澄清。

An illustration of the intended result

所以我的问题是:我如何编辑上面的代码以便获得预期的结果?也就是说,如何将p0p1分配给弹簧,以便它们引用原始对象?基本上,我尝试将引用分配给V2,而不是V2副本。我该怎么做?

2 个答案:

答案 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的指针。指针可以在以后更改,而引用只能在构造期间设置。