我想用重載的操作符創建一個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:好的,我完成了 –