【问题标题】:How can I assign a class instance by reference in C++?如何在 C++ 中通过引用分配类实例?
【发布时间】:2015-02-02 14:46:40
【问题描述】:

我用 C++ 编写了一个 SDL 图形程序(大约 300 行,所以我会尝试总结一下)。该程序涉及 Springs 和 Vertices,它们都是类。 Springs 以胡克式的方式对其两个 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,而不是V2副本。我该怎么做?

【问题讨论】:

  • 指针或引用类型,你都试过了。
  • 指针让我无所适从。我不确定是简单地将指针分配给V1-3,还是更改Spring 类中p0p1 的定义
  • 很好的图解问题! :)

标签: c++ class reference sdl


【解决方案1】:

更改Spring 的定义以存储Vertex 指针或引用。指针可以让您更灵活地移动弹簧并附加到不同的顶点:

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

然后像这样设置它们:

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

【讨论】:

  • 谢谢,这个答案对我有用。进行此更改后,我仍然必须将 Spring 类中 p0.memberp1.member 的每次使用编辑为 p0->memberp1->member
  • 是的,任何时候您想使用 p0p1 都需要取消引用指针。注意未初始化的、空指针或悬空指针。您可能希望Spring 的构造函数将p0p1 初始化为nullptr,然后在取消引用之前检查nullptr。如果您尝试在其所连接的顶点被移除后使用弹簧,您将遇到悬空指针。
【解决方案2】:

看起来你的 Spring 类存储了一个 Vertex,比如 in

class Spring {
public:
    Vertex p0, p1;
}

但您希望 Spring 存储对 Vertex 的引用,例如 in

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

【讨论】:

  • 我更喜欢指针,这样你以后可以用不同的顶点重用你的弹簧。
猜你喜欢
  • 2019-04-29
  • 2011-02-28
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2021-11-11
相关资源
最近更新 更多