2

便宜上、ジェネリック配列クラスとオーバーロード演算子を作成しています。Array<>オブジェクトに他のArray<>オブジェクトを保持させましたが、*演算子をオーバーライドするのに問題があります。左のオブジェクトをコピーする必要があるので、私のoperator*コードは次のとおりです。

Array<T>& operator*(const double scalar) {
    return Array<T>(*this) *= scalar;
}

(演算子* =はオーバーロードされて機能します)。

以下のようにコピーコンストラクターをオーバーライドします。

更新:新しいコピーコンストラクター:

Array<T> (const Array<T>& copyfrom) {
    size_=copyfrom.size();
    data=new T[size_];
    copy(&copyfrom.data[0], &copyfrom.data[size_], data);
}

私の考えでは、配列がジェネリックではなく、常にプリミティブで満たされている場合、このコードは機能します。しかし、予期しない動作を引き起こすテンプレートを使用しているため、ここで何かが起こっていると思います。新しい「ディープコピー」配列のデータ配列は、「copyfrom」データ配列の単なるシャローポインタコピーのように機能します。

テンプレートを使用して、このコピーコンストラクターをプリミティブとオブジェクトの両方で機能させるにはどうすればよいですか?または、さらに良いことに、コピーコンストラクターを気にせずにoperator *をオーバーロードする方法はありますか?ありがとう。

編集:これがのコードですoperator*=。ただし、私の問題はコピーコンストラクターの使用にあると思います。

Array<T>& operator*=(const double scalar) {
    for (int i=0; i<size_; i++)
        data[i]*=scalar;
    return *this;
}

size編集:配列の配列内の内部配列を無視していたため、問題が発生していることに気付きました。物事は今より信頼できます。みんな本当に助かりました、そして私はこの仕事をするための道を進んでいると思います。私operator=(私は過負荷ではありませんでした;良いキャッチ、マイケル)は現在以下のようになっています。期待どおりに動作しますmallocが、プログラムでエラーが発生し始めており、その理由を調査しています。ここでのメモリ管理に何か問題がありますか?

Array<T>& operator=(const Array<T>& a) {
    if (this==&a)
        return *this;
    delete [] data;

    size_=a.size();
    data=new T(size_);
    copy(&a.data[0], &a.data[a.size()], data);

    return *this;
}

編集:私はmallocエラーを修正しました!私のメソッドはすべて意図したとおりに機能しています。このメソッドヘッダーがあったため、メモリの問題が発生していました。

template <typename T>
static Array<T> matrixSolve (Array<Array<T> > m);

配列の配列を値で取得していました。あらゆる種類の問題。参照によって配列を取得し、すべてがうまくいきました。皆さん、助けてくれてありがとう!

4

1 に答える 1

3

オペレーター*メンバー関数は次のようになります。

Array<T> operator*(const double scalar) const {
    Array<T> result(*this);
    result *= scalar;
    return result;
}

を返すArray<T> &と、一時的なものへの参照が返され、破棄されて未定義の動作が発生します。

于 2012-04-05T02:56:22.383 に答える