我正在尝试使用重载运算符创建 CLI 值类 c_Location,但我认为我遇到了装箱问题。我已经实现了许多手册中所见的运算符重载,所以我确信这一定是正确的。这是我的代码:
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'
}
找了很久,发现错误是因为操作数是引用类型,因为它是值类型的数组元素,而函数只接受值类型,因为它是非托管引用。我现在有两种可能性:
- 添加一个拆箱演员
c_Location
,因此将 main() 中的错误行更改为
locValue = alocData[0] + (c_Location)alocData[1];
- 修改 operator+ 重载,使其按值而不是按引用获取参数:
c_Location operator+ (const c_Location i_locValue)
这两个选项都有效,但据我所知,它们都有缺点:
选择 1 意味着我必须在需要的地方显式转换。
opt 2 意味着该函数将在其调用时创建参数的副本,因此会浪费性能(虽然不多)。
我的问题:我的故障分析完全正确还是故障有其他原因?
有没有更好的第三种选择?
如果不是:1 或 2 哪个选项更好?我目前更喜欢#2。