Я пишу этот вопрос со ссылкой на этот , который я написал вчера. После небольшой документации мне кажется, что то, что я хотел сделать (и то, что я считал возможным), почти невозможно, если вообще невозможно. Есть несколько способов реализовать это, и, поскольку я не опытный программист, я спрашиваю вас, какой выбор вы бы выбрали. Я снова объясняю свою проблему, но теперь у меня есть некоторые решения для изучения.
Что мне нужно
У меня есть класс 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) быстро, так что, вероятно, прохождение по значению не должно быть опцией.
Какие решения я исследовал
Что ж, следуя советам из предыдущего обсуждения Я прочитал кое-что о умных указателях, они выглядят великолепно, но я до сих пор не могу понять, как решить мою проблему с ними. Они занимаются освобождением памяти и копированием указателей, но я в основном использую ссылки, поэтому они не выглядят для меня правильным выбором. Но я могу ошибаться.
Может быть, единственное решение - это передать по значению, может быть, я не могу получить и эффективность, и хороший интерфейс. Но опять же, вы эксперт, и мне хотелось бы узнать ваше мнение.