Reputation: 462
I have an object which needs to destroy itself.
Can it be done?
Is the example wrong?
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;
}
Upvotes: 21
Views: 29696
Reputation: 272517
Yes, it's legal to call delete this
from inside a member function. But there's very rarely a good reason to do so (especially if you're writing idiomatic C++ where most memory-management tasks should be delegated to containers, smart pointers, etc.).
And you need to be very careful:
new
(not new[]
).Upvotes: 38
Reputation: 121669
Q: Can an object destroy itself?
A: Sure. "delete this" is a popular idiom in COM/ActiveX
As far as your algorithm, I'd suggest:
a "board" object has "tiles". Perhaps just a simple 2-D array.
You start out with n "pieces"
Some controller (perhaps a "game" object), moves a "piece" with respect to a "tile".
Each "tile" has a reference to 0 or 1 "pieces"
I'm not sure I see any reason to create or delete anything on a per-move basis.
IMHO...
Upvotes: 1
Reputation: 12693
As long as you don't access member variables or the this
pointer after the call to destroy the object, you should be fine. Since it doesn't appear you're doing either of these things, the example should work.
Upvotes: 0
Reputation: 273274
Yes, it should work. Even delete this;
is allowed.
But the code calling specialMoves()
could be in for a nasty surprise.
Upvotes: 2