Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++中引用引用类实例? 我在C++中写了一个SDL图形程序,大约有300行,所以我会总结一下。该程序涉及弹簧和顶点,两者都是类。以胡克式的方式对它的两个物体施加一个力_C++_Class_Reference_Sdl - Fatal编程技术网

如何在C++中引用引用类实例? 我在C++中写了一个SDL图形程序,大约有300行,所以我会总结一下。该程序涉及弹簧和顶点,两者都是类。以胡克式的方式对它的两个物体施加一个力

如何在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

下面是初始化三个顶点和两个弹簧的代码。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的副本。我该怎么做呢?

您的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。如果在删除弹簧附着的顶点后尝试使用弹簧,将遇到悬空指针。