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

How can I assign a class instance by reference in C++?

我用C++写过一个SDL图形程序(大约300行,我尽量总结一下)。程序涉及到Springs和Vertices,都是类。 Springs apply a force to its two 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 的副本。我做了这个插图来澄清。

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

您的 class Spring 似乎存储了一个像

中的顶点
class Spring {
public:
    Vertex p0, p1;
}

但是您希望Spring像

一样存储对顶点的引用
class Spring {
public:
    Vertex &p0, &p1;
}

使用引用作为 class 成员意味着 Spring 需要一个构造函数来初始化 p0 和 p1:

Spring(Vertex &v1, Vertex &v2) : p0(v0), p1(v1) {}

并且您需要将 Spring 创作重写为

Spring S1(V1, V2);

您需要确保 V1 至少与 S1 一样长,以便引用保持有效。

当然Spring也可以存储指向顶点的指针而不是引用。指针可以稍后更改,而引用只能在构造期间设置。

更改 Spring 的定义以存储 Vertex 指针或引用。指针会给你更多的灵活性来做事情移动 spring 并附加到不同的顶点:

struct Spring {
  Vertex* p0;
  Vertex* p1;
};

然后像这样设置它们:

Spring S1;
S1.p0 = &V1;
S1.p1 = &V2;