0

これは私の宣言にあると思いますが、よくわかりません。int 型の 2 次元配列を作成するクラス「Matrix」があります。クラスには、クラス オブジェクトに対して演算などを実行するためのオーバーロードされた演算子がいくつかあります。

要件の 1 つは、行列の次元が同じであることを確認することです。ディメンションは、2 つのプライベート int "dx" と "dy" として格納されます。

したがって、これを効率的にするために、次のように bool 型のメンバー関数を記述しました。

bool confirmArrays(const Matrix& matrix1, const Matrix& matrix2);

は関数ヘッダーで、宣言は次のとおりです。

bool Matrix::confirmArrays(const Matrix& matrix1, const Matrix& matrix2)
{
    if (matrix1.dx == matrix2.dx && matrix1.dy == matrix2.dy)
    {
        // continue with operation
        return true;

    } else {

        // hault operation, alert user
        cout << "these matrices are of different dimensions!" << endl;
        return false;
    }
}

しかし、confirmArrays別のメンバー関数内から呼び出すと、このエラーが発生します。

宣言されていない識別子の使用 confirmArrays

そのように関数を呼び出します。

// matrix multiplication, overloaded * operator
Matrix operator * (const Matrix& matrix1, const Matrix& matrix2)
{
    Matrix product(matrix1.dx, matrix2.dy);
    if ( confirmArrays(matrix1, matrix2) )
    {
        for (int i=0; i<product.dx; ++i) {
            for (int j=0; j<product.dy; ++j) {
                for (int k=0; k<matrix1.dy; ++k) {
                    product.p[i][j] += matrix1.p[i][k] * matrix2.p[k][j];
                }
            }
        }
        return product;

     } else {

        // perform this when matrices are not of same dimensions
    }
}
4

2 に答える 2

1

あなたのoperator*は の範囲内で定義されていませんMatrix。実際にグローバル演算子を定義しました。あなたが必要

Matrix Matrix::operator * (const Matrix& matrix1, const Matrix& matrix2)
{
   ...
}

そして、それはうまくいくはずです。注意: これがコンパイルされていた場合、未定義の演算子 Matrix::operator* へのリンカーの未定義参照エラーが発生します。

于 2012-10-03T03:32:38.500 に答える
0

bool 関数は、算術関数をサポートするためにのみ必要です。これらの関数の中には、メンバーのオーバーロードされた演算子になるものもあれば、フレンドになるものもあります。ここでの秘訣は、bool 関数をフレンドとしても定義し、プライベート メンバー データにアクセスする機能を保持しながら、メンバー直接関数とフレンド関数から同様にアクセスできるようにすることでした。

friend bool confirmArrays(const Matrix& matrix1, const Matrix& matrix2);

于 2012-10-03T16:18:28.117 に答える