Я пишу этот вопрос со ссылкой на этот о котором я вчера писал. После небольшой документации мне кажется очевидным, что то, что я хотел сделать (и то, что я считал возможным), почти невозможно, если не невозможно вообще. Есть несколько способов реализовать это, и, поскольку я не опытный программист, я спрашиваю вас, какой выбор вы бы выбрали. Я снова объясняю свою проблему, но теперь у меня есть несколько решений, которые нужно изучить.
Что мне нужно
У меня есть класс Matrix, и я хочу реализовать умножение между матрицами, чтобы использование класса было очень интуитивно понятным:
Matrix a(5,2);
a(4,1) = 6 ;
a(3,1) = 9.4 ;
... // And so on ...
Matrix b(2,9);
b(0,2) = 3;
... // And so on ...
// After a while
Matrix i = a * b;
Что у меня было вчера
На данный момент я перегрузил два оператора operator*
и operator=
, и до вчерашней ночи они были определены следующим образом:
Matrix& operator*(Matrix& m);
Matrix& operator=(Matrix& m);
Оператор * создает новый объект Matrix (Matrix return = new Matrix(...)
) в куче, устанавливает значения, а затем просто:
return *result;
То, что у меня есть сегодня
После обсуждения я решил реализовать его в «другой способ», чтобы не беспокоить пользователя указателями любого типа и сохранить их использование неизменным. «Другой способ» - передать возвращаемое значение оператора * по значению:
Matrix operator*(Matrix& m);
Matrix& operator=(Matrix& m);
Оператор * создает экземпляр return
в стеке, устанавливает значения и затем возвращает объект.
У этого подхода есть проблема: он не работает. Оператор = ожидает матрицу &, а оператор * возвращает матрицу. Более того, этот подход не кажется мне таким хорошим по другой причине: я имею дело с матрицами, которые могут быть очень большими, и цели этой библиотеки должны были быть 1) достаточно хорошими для моего проекта 2) быстрыми, поэтому, вероятно, прохождение по стоимости не должно быть варианта.
Какие решения я изучил
Что ж, следуя предложениям из предыдущего обсуждения, я почитайте кое-что об умных указателях, они выглядят великолепно, но я до сих пор не могу понять, как с ними решить свою проблему. Они занимаются освобождением памяти и копированием указателей, но я в основном использую ссылки, поэтому они мне не подходят. Но я могу ошибаться.
Возможно, единственное решение - передать по значению, возможно, я не могу получить одновременно эффективность и хороший интерфейс. Но опять же, вы специалист, и мне хотелось бы узнать ваше мнение.