1

何が間違っているのかわからない。

Huge& Huge::operator *=(const Huge& h) {
    Huge retHuge = *this * h;
    string out1 = retHuge.toString(); // for debugging purposes
    return *this = retHuge;
//  return retHuge;
}

The

Huge retHuge = *this * h;

文字列で確認すると正常に動作しますout1。retHugeを返し、呼び出し元のルーチンに結果を出力すると、元のこれが変更されていないことがわかります。を実行し*this = retHugeて戻る*thisと、SEGSEGV障害が発生します。

デストラクタを呼び出してメモリをクリーンアップし、乗算後に結果を返す適切な方法は何ですか?

回答ありがとうございました。クレイジーエディは私が持っていたものを使用してそれを拡張しました。それはまさに私がやりたかったことです。彼の提案を反映するようにソースを変更すると、SEGSEGV障害が発生します。

これは、構文が基本的に正しい必要があるが、コードの残りの部分にバグが隠されていることを意味します。これは貴重な情報であり、私は戻って、何かを見つけることができるかどうかを非常に注意深く調べる必要があります。宿題をきちんとやる前に、怠けて助けを求めたくないので、まずはよく見ていきます。

私の経験は主に、参照されていないオブジェクト用の優れたガベージコレクターを備えたJavaです。デバッガーを調べて、メモリを解放するためにデストラクタが呼び出されていることを確認します。

これは、最初に* =演算子を実行してから、それから=演算子を作成するための良いヒントでした。明らかに私は反対の方向に物事をしました。それでもあなたの答えは、私がしたことは確かにうまくいくはずだということを示しているようです。動作しないので、戻って何か見つけられるか確認します。宿題を済ませても何も見つからない場合は、引き続き質問します。それまでの間、すべての助けに感謝します。

4

4 に答える 4

8

特定のケースに適用される正規形式のオーバーロード算術演算子:

Huge& Huge::operator *=(const Huge& h) // class member function
{
  // somehow multiply h's value into this' value
  return *this;
}


Huge operator*(Huge lhs, const Huge& rhs) // free function; note lhs being copied
{
  lhs *= rhs;  // *= already implemented above
  return lhs;
}

ここには動的メモリはまったく含まれていないため、削除する必要はありません。

複合代入フォームは、左側のオペランドを変更するため、演算子のオーバーロードの経験則に従ってメンバーである必要があります(クラスのプライベート部分にアクセスする必要がある可能性があります)。非割り当てバージョンは、暗黙の変換を両方のオペランドに等しく適用できるように、フリーメンバー関数である必要があります。

于 2012-05-06T11:23:35.660 に答える
2

しない でくださいdelete this; その後、*this未割り当てのメモリに書き込みます。

*this = retHuge代わりに、 (なしでdelete this)と言ってからreturn *this

代わりに割り当て解除を処理しますoperator =

これは完全な例であり、:の架空の複雑なペイロードがありint *ます。

#include <iostream>

class A {
public:
    A(int _val): val(new int(_val))
    { }

    ~A() {
        delete this->val;
    }

    A &operator =(const A &r) {
        // Pretend this->val is complex and we need to reallocate the
        // entire thing.
        delete this->val;

        this->val = new int(*r.val);

        return *this;
    }

    A operator *(const A &r) const {
        return A(*this->val * *r.val);
    }

    A &operator *=(const A &r) {
        return *this = *this * r;
    }

    int *val;
};

int main() {
    A x(5), y(10);
    x *= y;

    std::cout << "x: " << *x.val << ", y: " << *y.val << std::endl;
    return 0;
}
于 2012-05-06T11:04:10.813 に答える
1

あなたはすでに*演算子を持っているようで、この時点で代入が機能すると仮定するので、これが最良の実装になります。

Huge& Huge::operator *=(const Huge& h) {
    Huge retHuge = *this * h;

    return *this = retHuge;
}
于 2012-05-06T11:39:53.333 に答える
0

operator=これに右側のサイトを割り当てることを意味します。

したがって、この内容を変更して、最後に変更する必要がありますreturn *this;

于 2012-05-06T11:04:53.700 に答える