Может ли объект уничтожить себя? - PullRequest
13 голосов
/ 26 марта 2012

У меня есть объект, который должен уничтожить себя.

  • Можно ли это сделать?

  • Неправильный ли пример?

    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;
    }
    

Ответы [ 5 ]

28 голосов
/ 26 марта 2012

Да, законно вызывать delete this изнутри функции-члена. Но есть очень редко хорошая причина для этого (особенно если вы пишете идиоматический C ++, где большинство задач управления памятью должны быть делегированы контейнерам, интеллектуальным указателям и т.

И вам нужно быть очень осторожным:

  • объект самоубийства должен быть назначен динамически через new (не new[]).
  • После того, как объект совершил самоубийство, он не может делать все, что зависит от его собственного существования (он больше не может обращаться к своим собственным переменным-членам, вызывать свои собственные виртуальные функции и т.
8 голосов
/ 26 марта 2012
2 голосов
/ 26 марта 2012

Да, это должно работать. Даже delete this; разрешено.

Но код, вызывающий specialMoves(), может преподнести неприятный сюрприз.

1 голос
/ 26 марта 2012

В: Может ли объект уничтожить себя?

A: Конечно.«Удалить это» - популярная идиома в COM / ActiveX

. Что касается вашего алгоритма, я бы предложил:

  • у объекта "доска" есть "плитки",Возможно, это просто двумерный массив.

  • Вы начинаете с n «кусочков»

  • Какой-то контроллер (возможно, «игровой» объект), перемещает «кусок» относительно «плитки».

  • Каждая «плитка» имеет ссылку на 0 или 1 «части»

Я не уверен, что вижу какие-либо причины для создания или удаления чего-либо отдельно для каждого хода.

ИМХО ...

0 голосов
/ 26 марта 2012

Пока у вас нет доступа к переменным-членам или указателю this после вызова для уничтожения объекта, все будет в порядке. Поскольку кажется, что вы не делаете ни одну из этих вещей, пример должен сработать.

...