0

コピーコンストラクタと代入演算子に問題があります。行列を乗算するコードを記述している:

Matrix& Matrix::operator * (const Matrix &second) const
{
    // Create result matrix
    Matrix result(Rows(), second.Columns());

    // Multiply matricies
    for (unsigned i = 0; i < Rows(); i++)
    {
         for (unsigned j = 0; j < second.Columns(); j++)
         {
             result[i][j] = 0.0;

             for (unsigned k = 0; k < Columns(); k++)
             {
                 result[i][j] += m_matrix[i][k] * second[k][j];
             }
         }
    }

    return result;
}

メインコードでは、演算子を呼び出します。

Matrix C = A * B;

ただし、コードは代入前に結果変数を破棄します。そのようなコードを正しく記述して結果行列を返すにはどうすればよいですか?コピーコンストラクタは次のとおりです。

Matrix::Matrix(const Matrix& matrix)
{
    AllocateMatrixArray(matrix.Rows(), matrix.Columns());
    CopyMatrixData(matrix);
}

代入演算子は次のとおりです。

Matrix& Matrix::operator = (const Matrix& other)
{
    AllocateMatrixArray(other.Rows(), other.Columns());
    CopyMatrixData(other);
    return *this;
}

ただし、コンパイラはそれを使用していないことがわかります。コピーコンストラクタで十分です。

4

3 に答える 3

1

C = A*B のような式を書きたい場合、すべての CA と B は「値」でなければなりません。

したがって、 の戻り値は であるoperator*必要がmatrixありmatrix&、特に&がローカル変数を参照している場合 ( のように)、 (したがって = が実行される前にresult) 破棄されます。}

とはいえ、さらにいくつかの問題があります。

  • サンプルMatrix C = A*Bは割り当てではありません。割り当ては、既存のオブジェクトの値が変更されたときに発生します。しかし、行列 C はコンテキストに応じて作成されます。実際、ここで呼ばれているのはMatrixコンストラクター (この場合はコピー コンストラクター) です。

  • メモリ リークが発生している可能性があります。行列データがどのように処理されるかはわかりませんが、operator= 新しい領域を割り当ててからデータをコピーしているようです。しかし、古いデータを含むスペースはどうなるでしょうか? 忘れられたままですか?はスマートポインタによって自動的に解放されますか?

  • 同様に、=古いデータを破棄する必要があるのと同様に、クラス自体も破棄時に自身のデータを破棄する必要があるため、デストラクタも実装する必要があります。そうしないと、 Matrix が ( local のように) 破棄されるたびにresult、そのデータが残ります。

于 2013-01-25T15:51:02.747 に答える
1

ローカル変数への参照を返すべきではありません。慣例により、opertor*(もちろん 2 つの引数のバージョンを意味します) は結果のコピーを返します。operator+などの他の操作についても同じことが言えますoperator-operator *=参照は、などの演算子の変更バージョンによって返されoperator +=ます。

于 2013-01-25T15:06:44.170 に答える
1

コードは、関数のスコープの最後で破棄されるローカル変数への参照を返します。そうしないでください:

Matrix Matrix::operator * (const Matrix &second) const {
     // same as above
}

戻り値がMatrixではなく になっていることに注意してくださいMatrix&

于 2013-01-25T15:07:59.870 に答える