在C ++中用自身替换对象

时间:2012-02-09 16:48:18

标签: c++ oop object pointers

如何在ASNI C ++中替换自身?我想要一个像foo-> replaceBy(bar)这样的函数 这会导致对象foo自行删除并用bar替换指针

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

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

3 个答案:

答案 0 :(得分:1)

除非您将指针传递给指针或对指针的引用(example here),否则无法执行此操作:

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 :(得分:1)

指针不能替换自己 - 对象当然可以修改自己,但thisconst,因为可能有多个指针指向一个对象从逻辑上讲,对象如何知道它属于哪个指针(它根本不属于单个甚至任何指针)。

但是,Envelope–Letter pattern可能对您的特定问题有所帮助。

答案 2 :(得分:0)

使用PIMPL成语,很容易有效地让对象互相吸引:The Pimpl Idiom in practice

也许你还想要一个swap方法来交换两个对象的内容。 https://stackoverflow.com/a/843418/1149664