如何在C++中通过引用传递?
How can I pass by reference in C++?
我需要遍历对象的向量,并更改它们的变量。但是,当我这样做时,C++会给我以下错误:
void Projectile::setX(float &)': cannot convert argument 1 from 'float' to 'float &'
initial value of reference to non-const must be an lvalue
我尝试这样做的方式是在这个 for 循环中:
for (Projectile p : activeProjectiles) {
if (p.isLeftPublic) {
float g = p.getX();
p.setX(g - (60));
}
else if (!p.isLeftPublic) {
float g = p.getX();
p.setX(g - (60));
}
}
GetX 和 SetX 函数如下所示:
float Projectile::getX() {
return x;
}
void Projectile::setX(float &_x) {
this->x = _x;
}
任何帮助将不胜感激。
首先,确实没有理由通过引用将float
传递到此函数中。它已经很小了。
但是,如果你真的想,它应该是一个const float&
,因为你没有修改它。
事实上,如果你要像这里一样将一个临时绑定到它,它必须是const float&
的。
tl;dr:
g - (60)
不是变量
然后你需要修复你的循环,它目前根本不影响activeProjectiles
:
for (Projectile& p : activeProjectiles) {
// ^ important!
问题的根源是你按值迭代,所以你尝试在循环中修改副本。它应该是:
for (Projectile &p : activeProjectiles) {
您根本不需要void Projectile::setX(float &)
参考。看起来您听说要解决您的问题,您需要在某处参考,并且您找到了随机放置它的地方。你在错误的树上吠叫。
通常,使用非const
引用的唯一原因是当您打算更改引用的对象时。当然,这样的事情不应该发生在二传手函数中。如果像setX(my_var);
这样的电话实际上修改了my_var
,那将是一个很大的惊喜,不是吗?
最好的解决方案是按值传递float
。
如果你让它const
,你可以得到引用的工作,因为那样它就会符合C++语言规则,否则它会阻止你绑定一个未命名的临时对象的引用,比如由g - (60)
产生的对象;然而,这将一无所获,只是看起来很奇怪。const
引用通常用于传递"大"对象时的性能。float
不是一个"大"对象。
您正在使用数学表达式调用函数,如果您的函数不是通过引用,该表达式将起作用。 G-60不是一个变量,那么你如何引用它?您需要某种具有地址的变量或对象,以便通过引用传递它。考虑先做 g -= 60,然后将 g 传递到 setx 中,或者像上面提到的使用 const float&
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?