传递指针的正确方法? C ++

时间:2015-07-17 20:57:39

标签: c++ pointers

我有一个简单的问题,我不是百分百肯定的。

我们假设我有一个Entity类,用于处理屏幕上的对象。让我们说实体类有两个浮点变量,'x'和'y'(又名坐标)。另外,让我们说我传递的实体已经被声明并且在内存中。

我有另一个处理相机移动的课程。它需要一个实体以中心为中心。它所居中的实体可以改变,所以我需要在这里使用指针。我在这里唯一要做的就是在需要时抓住X和Y变量。这里没有任何改变。

我已将其定义为

void StarField::ChangeFollowEntity(Entity* newFollowEntity) {
    followEntity = newFollowEntity;
}

其中followEntity也是一个Entity类。我会调用ChangeFollowEntity(..)来更改实体。这实际上是对的吗?

但我也看到了这个:

void StarField::ChangeFollowEntity(Entity newFollowEntity) {
    followEntity = &newFollowEntity;
}

在两种情况下,followEntity都被定义为Entity * followEntity; ..第二个例子到底在做什么?根据我的理解,&通常用作参考类型。这可能是不正确的。

我很确定在这种情况下我不应该使用引用,因为followEntity更改,我相信哪些引用不能更改,必须定义。

所以我的问题是,我的第一个例子是正确的,正确的做法是什么?第二个例子到底做了什么?

3 个答案:

答案 0 :(得分:3)

在你的第二个版本::

void StarField::ChangeFollowEntity(Entity newFollowEntity) {
    followEntity = &newFollowEntity;
}

您按值传递newFollowEntity,因此从main或从任何地方调用您的函数时!创建对象的副本(使用复制构造函数)并发送到函数ChangeFollowEntity,并在完成函数执行后,followEntity具有 COPY的地址对象,在函数调用完成后被销毁,因此指针followEntity悬空,如果使用followEntity

首先是正确的方法!!

答案 1 :(得分:1)

  

第二个例子到底做了什么?

您的第二个示例创建的Entity newFollowEntity 仅在该函数调用期间存在。

存储该变量的地址,然后销毁该变量,留下dangling pointer

那很糟糕。

  

我很确定在这种情况下我不应该使用引用,因为followEntity更改,我相信哪些引用无法更改

在这种情况下,可以使用引用。引用的对象可以更改 - 您可能正在回忆a reference cannot be reassigned.

答案 2 :(得分:1)

第二个例子执行以下操作:

  1. 当该函数被调用为新的Entity对象newFollowEntiry时 已创建,并且传递给函数的任何内容都用于 构建它
  2. 然后获取该基于本地堆栈的对象的地址 分配给followEntiry大概存储。
  3. 当功能执行完成时newFollowEntiry被销毁
  4. folowEntity指针现在指向堆栈中的位置 不再有Entity个对象了。
  5. BUG