我想用重载的操作符创建一个CLI值类c_Location,但我认为我有一个拳击问题。我已经实现了操作符重载,如许多手册中所见,所以我相信这一定是正确的。 这是我的代码:C++/CLI:如何重载运算符来接受引用类型?
value class c_Location
{
public:
double x, y, z;
c_Location (double i_x, double i_y, double i_z) : x(i_x), y(i_y), z(i_z) {}
c_Location& operator+= (const c_Location& i_locValue)
{
x += i_locValue.x;
y += i_locValue.y;
z += i_locValue.z;
return *this;
}
c_Location operator+ (const c_Location& i_locValue)
{
c_Location locValue(x, y, z);
return locValue += i_locValue;
}
};
int main()
{
array<c_Location,1>^ alocData = gcnew array<c_Location,1>(2);
c_Location locValue, locValue1, locValue2;
locValue = locValue1 + locValue2;
locValue = alocData[0] + alocData[1]; // Error C2679 Binary '+': no operator found which takes a right-hand operand of type 'c_Location'
}
搜索较长时间后,我发现错误来自操作数被引用类型,因为它是一个值类型的数组元素,并且函数只接受值类型,因为它需要非托管引用。我现在有2个possibiblities:
- 添加开箱浇铸到
c_Location
等改变故障线路在main()到
locValue = alocData[0] + (c_Location)alocData[1];
- 修改操作员+重载,以便它通过值,而不是通过采用参数参考:
c_Location operator+ (const c_Location i_locValue)
两个选项工作,但据我所看到的,他们都有缺点:
选择1意味着我必须在需要的地方明确施放。
选择2意味着该函数将在其调用中创建参数的副本,因此浪费性能(尽管不多)。
我的问题:我的失败分析是否正确或失败是否有其他原因?
有更好的第三个选择吗?
如果不是:哪个选项1或2更好?我现在更喜欢#2。
它的工作原理,谢谢!但我现在有点困惑:这是否意味着我将使用跟踪引用,尽管我没有创建gc对象?我是否也应该使用非托管类型的托管参考?: 'c_Location&operator + =(const double%i_dValue)'? 还是我完全错了,所有类型将被编译为托管类型(双 - > System :: Double?)? –
@Tobias:让我扩展一下我的答案,以涵盖您的原始诊断,该诊断接近但不完全正确。 –
@Tobias:好的,我完成了 –