オーバーロードされた演算子を使用して 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'
}
より長い時間検索した後、値型の配列要素であるためオペランドが参照型であり、関数がアンマネージ参照を取るため値型のみを受け入れることがエラーの原因であることがわかりました。私は今2つの可能性を持っています:
- アンボクシング キャストを追加して
c_Location
、main() の障害のある行を
locValue = alocData[0] + (c_Location)alocData[1];
- operator+ オーバーロードを変更して、パラメーターを参照ではなく値で受け取るようにします。
c_Location operator+ (const c_Location i_locValue)
どちらのオプションも機能しますが、私が見る限り、どちらにも欠点があります。オプション
1 は、必要に応じて明示的にキャストする必要があることを意味します。
opt 2 は、関数が呼び出し時にパラメーターのコピーを作成するため、パフォーマンスが無駄になることを意味します (ただし、それほどではありません)。
私の質問: 私の失敗分析はまったく正しいですか、それとも失敗には別の理由がありますか?
より良い第 3 の選択肢はありますか?
そうでない場合: 1 と 2 のどちらのオプションが優れていますか? 私は現在、#2を好みます。