参考参数返回副本
Reference parameter returning copy
无论出于何种原因,此参考参数正在返回副本。因此,当我更改索引0的Outweapon时,它不会影响武器1。我做错了吗?
class ULoadout
{
public:
ULoadout();
FWeaponSlot Weapon1;
FWeaponSlot Weapon2;
FWeaponSlot Weapon3;
FWeaponSlot Weapon4;
FSkillSlot Skill1;
FSkillSlot Skill2;
FSkillSlot Skill3;
FSkillSlot Skill4;
void GetWeapon(int32 InIndex, FWeaponSlot& OutWeapon);
void GetSkill(int32 InIndex, FSkillSlot& OutSkill);
};
void ULoadout::GetWeapon(int32 InIndex, FWeaponSlot& OutWeapon)
{
switch (InIndex)
{
case 0:
OutWeapon = Weapon1;
break;
case 1:
OutWeapon = Weapon2;
break;
case 2:
OutWeapon = Weapon3;
break;
case 3:
OutWeapon = Weapon4;
break;
default:
break;
}
}
重构
FWeaponSlot& ULoadout::GetWeapon(int32 InIndex)
是这样做的明智和惯用方式。(C 不允许您重新启用参考。)
如果我正确理解了这一点,则只能使用参考参数来改变其引用的te对象,但不能将呼叫者中的引用分配给另一个对象。为此,需要一个指针,可以如下完成。
void ULoadout::GetWeapon(int32 InIndex, FWeaponSlot*& OutWeapon)
{
switch (InIndex)
{
case 0:
OutWeapon = &Weapon1;
break;
case 1:
OutWeapon = &Weapon2;
break;
case 2:
OutWeapon = &Weapon3;
break;
case 3:
OutWeapon = &Weapon4;
break;
default:
break;
}
}
呼叫者还需要提供要交换对象的地址。但是,一个不同的解决方案,例如返回对所需对象的引用或简单地使用数组索引可能更容易理解。
考虑如何调用getWeapon
函数:
ULoadout u; // where ever you got it from...
FWeaponSlot s; // you need a true object!!!
u.getWeapon(0, s); // now you pass the true object in as reference!
getWeapon
中现在发生的有效的是:
s = weapon1;
请注意s
是一个对象,而不是参考,因此您将u.weapon1
复制到s
...
要避免在特定情况下,您需要指针:
FWeaponSlot* s = u.getWeapon(0);
请注意,我默默地更改了签名(只是为了方便电话)...
u
仍然是对象的所有者,并将在被销毁时自动清理它们,因此在这种特定情况下无需任何智能指针。只要确保您在u
的寿命结束后不使用s
指针...
,而服用FWeaponSlot*&
可以解决您的问题,但我建议使用常规Getter:
class ULoadout
{
FWeaponSlot weapons[4];
FSkillSlot skills[4];
public:
ULoadout();
const FWeaponSlot& GetWeapon(int32 index) const { return weapons[index]; }
FWeaponSlot& GetWeapon(int32 index) { return weapons[index]; }
const FSkillSlot& GetSkill(int32 index) const { return skills[index]; }
FSkillSlot& GetSkill(int32 index) { return skills[index]; }
};
如果您设置了使用引用,则将方法更改为:
FWeaponSlot& ULoadout::GetWeapon(int32 InIndex);
但是,您需要检查InIndex
在方法中是否有效,因为您无法返回指示"无武器"的值。P>
if(InIndex > 3) throw std::out_of_range("invalid weapon index");
另一种选择是返回指针,并具有null
表示"无武器":
FWeaponSlot* ULoadout::GetWeapon(int32 InIndex);
相关文章:
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 如何在模板类中返回成员变量的副本
- 如何声明接受转发引用并返回引用或副本的函数模板
- 有条件的操作员从其参数的副本中返回值
- 我可以返回副本作为参考吗?
- 返回不带副本 ctor 的引用
- 'std::any_cast' 返回一个副本
- 按值副本返回,而不是移动
- 参考参数返回副本
- C++方法返回自身副本时内存泄漏
- 为什么迭代器运算符 + 返回副本
- 节点.js C++ 插件:返回新副本
- 如何通过制作副本从函数返回引用
- 为什么返回 std::vector 仍然是在制作副本
- 就地修改并返回副本有意义吗
- 我需要为返回容器副本的函数添加锁吗
- 改变字符串的副本并返回值,而不是更改原始字符串
- 通过两个副本返回值
- Qml和C++交互:通过指针或副本返回