如何在 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 胡克风格。
这里是初始化三个顶点和两个弹簧的代码。 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
分配给弹簧,以便它们引用原始对象?基本上,我试图将 references 分配给 V2
,而不是 V2
的 copies。我该怎么做?
您的 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;
我用C++写过一个SDL图形程序(大约300行,我尽量总结一下)。程序涉及到Springs和Vertices,都是类。 Springs apply a force to its two 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
分配给弹簧,以便它们引用原始对象?基本上,我试图将 references 分配给 V2
,而不是 V2
的 copies。我该怎么做?
您的 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;