2012-03-25 16 views
11

私はそれ自身を破壊する必要があるオブジェクトを持っています。オブジェクトは自分自身を破壊できますか?

  • できますか?

  • この例は間違っていますか?

    void Pawn::specialMoves(Coordinate const& from, Coordinate const& to, int passant) 
    { 
        /*...*/ 
        m_board->replace(to, new Queen(m_colour));//replace pawn by queen 
    } 
    
    void Board::replace(Coordinate const &to, Piece* newPiece) 
    { 
        delete tile[to.x()][to.y()]; 
        tile[to.x()][to.y()] = newPiece; 
    } 
    
+4

ここではどのオブジェクトがそれを破壊していますか?FTRであれば、それを破壊することは 'delete this;'または 'this->〜T();'( 'T'はその型です)のいずれかです。どちらも有効ですが、正しく使用するには多くの注意が必要です。 –

+0

あなたの例では、自分自身を破壊するものは何も表示されません。 –

+1

Pawnはそれ自体を削除します。私は一度 'm_board-> replace(to、new Queen(m_colour));'が関数voidと呼ばれていたと思います。Pawn :: specialMoves(...) '完了できません。 ' – danjjl

答えて

25

はい、それは、メンバ関数内からdelete thisを呼び出すための法的です。しかし、が非常にであることはめったにありません(特に、大部分のメモリ管理タスクをコンテナ、スマートポインタなどに委譲する熟語C++を書く場合)。

そして、あなたは非常に注意する必要があります。

  • 自殺オブジェクトはnew(ないnew[])を経由して、動的に割り当てられている必要があります。
  • オブジェクトが自殺した場合、オブジェクト自体の存在に依存している(それ自身のメンバー変数にアクセスできなくなり、独自の仮想関数などを呼び出すことはできません)何かを行うための未定義の動作です。
+4

+1は決して 'new []'を考えていませんでした。 – hmjd

+1

少し遅れましたが、 'new []'でオブジェクトが確保されていないことを確認するには、 'operator new []()= delete'と書いてください。 – iFreilicht

+0

私は、 'std'コンテナを呼び出すメソッドも同様に、amiriteであると仮定していますか? –

2

はい、動作するはずです。たとえdelete this;でも可能です。

しかし、コードspecialMoves()を呼び出すことは、厄介な驚きのためにある可能性があります。

0

オブジェクトを破棄する呼び出しの後にメンバー変数またはthisポインタにアクセスしない限り、正常であるはずです。あなたがこれらのことのどちらかをしているようには見えないので、その例はうまくいくはずです。

1

Q:オブジェクトは自分自身を破壊できますか?

A:はい。 「削除これは、」COM/ActiveXの

で人気のイディオムである限り、あなたのアルゴリズムとして、私がお勧めしたい:

  • を「ボード」オブジェクトは、「タイル」を持っています。たぶん単純な2次元配列です。

  • あなたには、いくつかのコントローラ(おそらく「ゲーム」オブジェクト)のn「個の」

  • から始め、「タイル」に関して「ピース」を移動させます。

  • 各「タイルは、」私は私があたり、移動ベースで何かを作成または削除する理由を参照してくださいわからない

0または1「作品」への参照を持っています。

IMHO ...

+2

私はポーンがボードの反対側の端に達すると、それは女王に取って代わることになると思います。 –

関連する問題