Я пытаюсь создать класс значений 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];
- изменение перегрузки оператора +, чтобы он принимал параметр по значению, а не по ссылке:
c_Location operator+ (const c_Location i_locValue)
оба варианта работают, но, насколько я вижу, у них обоих есть недостатки:
вариант 1 означает, что я должен явно выполнять приведение типов везде, где это необходимо.
вариант 2 означает, что функция создаст копию параметра на своем звоните и, следовательно, тратьте впустую производительность (хотя и не так много).
Мои вопросы: Верен ли вообще мой анализ сбоев или у сбоя есть другая причина?
Есть ли лучшая третья альтернатива?
Если нет: какой вариант, 1 или 2, лучше? Сейчас я предпочитаю №2.