如何在C++中引用引用类实例? 我在C++中写了一个SDL图形程序,大约有300行,所以我会总结一下。该程序涉及弹簧和顶点,两者都是类。以胡克式的方式对它的两个物体施加一个力
下面是初始化三个顶点和两个弹簧的代码。S1和S2是弹簧,V1、V2和V3是顶点如何在C++中引用引用类实例? 我在C++中写了一个SDL图形程序,大约有300行,所以我会总结一下。该程序涉及弹簧和顶点,两者都是类。以胡克式的方式对它的两个物体施加一个力,c++,class,reference,sdl,C++,Class,Reference,Sdl,下面是初始化三个顶点和两个弹簧的代码。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
//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的副本。我该怎么做呢?您的Spring类似乎在
class Spring {
public:
Vertex p0, p1;
}
class Spring {
public:
Vertex &p0, &p1;
}
但您希望Spring存储对顶点的引用,如中所示
class Spring {
public:
Vertex p0, p1;
}
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也可以存储指向顶点的指针,而不是引用。指针可以稍后更改,而引用只能在构造期间设置。您的类Spring似乎存储了一个顶点,如中所示
class Spring {
public:
Vertex p0, p1;
}
class Spring {
public:
Vertex &p0, &p1;
}
但您希望Spring存储对顶点的引用,如中所示
class Spring {
public:
Vertex p0, p1;
}
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也可以存储指向顶点的指针,而不是引用。指针可以稍后更改,而引用只能在构造期间设置。更改Spring的定义以存储顶点指针或引用。指针将使您能够更灵活地移动弹簧并附着到不同的顶点:
struct Spring {
Vertex* p0;
Vertex* p1;
};
然后将它们设置为:
Spring S1;
S1.p0 = &V1;
S1.p1 = &V2;
更改Spring的定义以存储顶点指针或引用。指针将使您能够更灵活地移动弹簧并附着到不同的顶点:
struct Spring {
Vertex* p0;
Vertex* p1;
};
然后将它们设置为:
Spring S1;
S1.p0 = &V1;
S1.p1 = &V2;
指针或引用类型,你尝试过什么。指针把我弄糊涂了。我不确定是简单地将指针分配给V1-3,还是在Spring问题中更改p0和p1的定义!:指针或引用类型,你尝试过什么。指针把我弄糊涂了。我不确定是简单地将指针分配给V1-3,还是在Spring问题中更改p0和p1的定义!:我更喜欢指针,这样你以后可以用不同的顶点重用你的弹簧。我更喜欢指针,这样你以后可以用不同的顶点重用你的弹簧。谢谢你,这个答案对我有用。在进行此更改之后,我仍然必须将Spring类中p0.member和p1.member的每次使用都编辑为p0->member和p1->member。是的,任何时候要使用p0或p1,都需要取消对指针的引用。注意未初始化的、空的或悬空的指针。您可能希望Spring的构造函数将p0和p1初始化为nullptr,然后在取消引用之前检查nullptr。如果在移除弹簧所连接的顶点后尝试使用弹簧,您将遇到悬空指针。谢谢,这个答案对我很有用。在进行此更改之后,我仍然必须将Spring类中p0.member和p1.member的每次使用都编辑为p0->member和p1->member。是的,任何时候要使用p0或p1,都需要取消对指针的引用。注意未初始化的、空的或悬空的指针。您可能希望Spring的构造函数将p0和p1初始化为nullptr,然后在取消引用之前检查nullptr。如果在删除弹簧附着的顶点后尝试使用弹簧,将遇到悬空指针。