我有一个简单的问题,我不是百分百肯定的。
我们假设我有一个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更改,我相信哪些引用不能更改,必须定义。
所以我的问题是,我的第一个例子是正确的,正确的做法是什么?第二个例子到底做了什么?
答案 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)
第二个例子执行以下操作:
Entity
对象newFollowEntiry
时
已创建,并且传递给函数的任何内容都用于
构建它followEntiry
大概存储。 newFollowEntiry
被销毁folowEntity
指针现在指向堆栈中的位置
不再有Entity
个对象了。