在C+中替换对象本身+; 一个对象如何在ASNI C++中替换它自己?我想要一个像foo->replaceBy(bar)这样的函数 这将导致对象foo删除自身并用bar替换指针 if (foo->isFoo()) { foo->replaceBy(bar); } ASSERT(foo->isFoo(), false); ASSERT(foo->isBar(), true);

在C+中替换对象本身+; 一个对象如何在ASNI C++中替换它自己?我想要一个像foo->replaceBy(bar)这样的函数 这将导致对象foo删除自身并用bar替换指针 if (foo->isFoo()) { foo->replaceBy(bar); } ASSERT(foo->isFoo(), false); ASSERT(foo->isBar(), true);,c++,oop,object,pointers,C++,Oop,Object,Pointers,使用PIMPL习惯用法,很容易有效地让对象相互取代: 也许您还需要一个swap方法来交换两个对象的内容 除非传递指向指针的指针或指向指针()的引用,否则无法执行此操作: 这将破坏replaceBy作为非静态成员函数的目的 还有一种方法可以做到这一点(不要): 我建议您重载操作符=,尽可能远离指针,或者至少使用智能指针(允许在没有内存泄漏的情况下分配指针)。指针无法替换自身–对象当然可以修改自身,但这是常量,由于指向一个对象的指针可能不止一个,因此从逻辑上讲,一个对象无法知道它属于哪个指针(它

使用
PIMPL
习惯用法,很容易有效地让对象相互取代:


也许您还需要一个
swap
方法来交换两个对象的内容

除非传递指向指针的指针或指向指针()的引用,否则无法执行此操作:

这将破坏
replaceBy
作为非静态成员函数的目的


还有一种方法可以做到这一点(不要):


我建议您重载
操作符=
,尽可能远离指针,或者至少使用智能指针(允许在没有内存泄漏的情况下分配指针)。

指针无法替换自身–对象当然可以修改自身,但
这是
常量,由于指向一个对象的指针可能不止一个,因此从逻辑上讲,一个对象无法知道它属于哪个指针(它根本不属于一个指针,甚至不属于任何指针)


但是,可能对您的特定问题有帮助。

有一个赋值运算符(如果需要,甚至可以重载)。您是否尝试过=运算符?“替换自身”?解释一下你的意思……如果你想一想,你就有问题了。@m0skit0做{foo->replaceBy(bar);}比{delete foo;foo=bar;}更合适,我想知道如何实现它。好吧,foo不一定是指针,它可能是一个带有->重载的对象,其中包含指针。不过,探索这个选项仍然没有什么可推荐的,我不确定const ness是否会让它成为一个选项,如果您愿意的话:-)
void replaceBy(Foo*& foo, Foo* bar) {
  delete foo;
  foo = bar;
}

//...

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