Замена объекта из себя в C ++ - PullRequest
1 голос
/ 09 февраля 2012

Как объект может заменить себя в ASNI C ++? Я хочу такую ​​функцию, как foo-> replaceBy (bar) что заставит объект foo удалить себя и заменить указатель на bar

if (foo->isFoo())
{
    foo->replaceBy(bar);
}

ASSERT(foo->isFoo(), false);
ASSERT(foo->isBar(), true);

Ответы [ 3 ]

1 голос
/ 09 февраля 2012

Вы не можете сделать это, пока не передадите указатель на указатель или ссылку на указатель ( пример здесь ):

void replaceBy(Foo*& foo, Foo* bar) {
  delete foo;
  foo = bar;
}

//...

foo->replaceBy(foo, bar);

Что бы победить цель replaceByявляясь нестатической функцией-членом.


Для этого также существует макрос überevil ( не ):

#define FOO_REPLACE_BY(foo, bar) do {delete foo; foo = bar;} while(0)

Я рекомендую вам перегрузить operator= и избегать указателей, когда это возможно, или, по крайней мере, использовать интеллектуальные указатели (которые позволяют назначать указатели без утечек памяти).

1 голос
/ 09 февраля 2012

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

Однако, возможно, шаблон Envelope – Letter поможет вамособая проблема.

0 голосов
/ 09 февраля 2012

С идиомой PIMPL легко эффективно позволяют объектам занимать друг друга: Идиома Pimpl на практике

Возможно, вы также хотите swap способ поменять содержимое двух объектов.https://stackoverflow.com/a/843418/1149664

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...