昨日書いたこの質問を参考にして、この質問を書いています。少し文書化した後、私がやりたかったこと (そして私が可能だと信じていたこと) は、まったく不可能ではないにしても、ほぼ不可能であることが明らかになりました。それを実装するにはいくつかの方法があります。私は経験豊富なプログラマーではないので、どの方法を選択するかお尋ねします。私の問題をもう一度説明しますが、今はいくつかの解決策を検討する必要があります。
必要なもの
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;
昨日持っていたもの
現時点では、2 つの演算子をオーバーロードしてoperator*おりoperator=、昨日の夜までは次のように定義されていました。
Matrix& operator*(Matrix& m);
Matrix& operator=(Matrix& m);
operator* は、ヒープ上で新しい Matrix オブジェクト ( Matrix return = new Matrix(...)) をインスタンス化し、値を設定してから、次のようにします。
return *result;
私が今日持っているもの
議論の後、ユーザーがあらゆるタイプのポインターに煩わされるのを避け、使用法を変更しないようにするために、「別の方法」で実装することにしました。「別の方法」は、 operator* の戻り値を値で渡すことです。
Matrix operator*(Matrix& m);
Matrix& operator=(Matrix& m);
operator*returnはスタック上でインスタンス化し、値を設定してからオブジェクトを返します。
このアプローチには問題があります。うまくいきません。operator= は Matrix& を期待し、operator* は Matrix を返します。さらに、このアプローチは別の理由で私にはあまり良く見えません:私は行列を扱っていますが、それは非常に大きくなる可能性があり、このライブラリの目的は1)私のプロジェクトにとって十分に良い2)高速であるため、おそらく合格することでした値によるオプションは使用できません。
私が調査したソリューション
さて、前の議論の提案に従って、スマート ポインターに関するいくつかの資料を読みました。それらは見栄えがしますが、問題を解決する方法をまだ理解できません。それらはメモリの解放とポインタのコピーを処理しますが、私は基本的に参照を使用しているため、適切な選択ではないようです。しかし、私は間違っているかもしれません。
おそらく唯一の解決策は値渡しであり、効率と優れたインターフェースの両方を得ることができないのかもしれません。繰り返しますが、あなたは専門家ですので、あなたの意見を知りたいです。