如何在对象成员函数内重新分配`this`指针?

Kir*_*ill 6 c++ pointers this

我有一个关于C++指针的有趣问题.

你可能会认为我必须改变我的设计,避免做我正在做的事情,你可能是对的.但是我们假设我有充分的理由按照我的方式去做.

所以这就是情况.我有一个C++类TestClass,我有一个这种类型的指针A:

TestClass* A = new TestClass();
Run Code Online (Sandbox Code Playgroud)

TestClass除此之外还有这个功能:

void TestClass::Foo(){
    TestClass* B = new TestClass();
    ...
}
Run Code Online (Sandbox Code Playgroud)

此函数创建相同类型的对象B,并使用一些数据填充它.

在这个函数的最后,我希望指针A指向对象B.在这个函数之外的任何地方它看起来像A=B; 在这个函数中它可能看起来像 但你知道你不能重新分配"this"指针.this = B

可能的解决方案:

  1. 复制内存:

    memcpy(this, B, sizeof(TestClass));
    
    Run Code Online (Sandbox Code Playgroud)

    此方法正常工作.该函数将对象B的每个位复制到对象A中.
    问题:如果TestClass是一个大对象(并且它是),它会为多个Foo调用创建显着的性能开销.

  2. 从函数返回一个B指针并执行类似的操作

    Temp = A;
    A=A->Foo();
    freeMemory(Temp);
    
    Run Code Online (Sandbox Code Playgroud)

    但是这段代码看起来很愚蠢,而且它使得函数Foo很难使用.

所以问题是,如何this = B在成员函数内部完成,而不复制整个对象?

Bil*_*ill 13

使用额外的间接级别.您的TestClass可以有一个指向包含其所有数据的类的指针.

class TestClass
{
private:
  TestClassData* m_data;

};

void TestClass::Foo()
{
  TestClassData* B = new TestClassData();
  ... 
  delete m_data;
  m_data = B;
} 
Run Code Online (Sandbox Code Playgroud)

operator==如果m_data的内容相等,请确保返回true.

  • 如果您的目标是最大限度地减少数据复制,我认为这是最优雅的方式. (2认同)
  • "计算机科学中的任何问题都可以通过添加另一层抽象来解决" - (希望我能记得我在哪里看过) (2认同)

Joh*_*ing 7

我怎么能这样做= B.

你不能.

其中一个工作解决方案:memcpy(this,B,sizeof(TestClass)); 这种方法工作正常.

如果TestClass不是POD,则此功能不起作用.例如,您无法使用虚函数记忆对象.你会吹掉vtable.


ale*_*rus 6

在你的功能里面,你可以做到

*this = B;
Run Code Online (Sandbox Code Playgroud)

这使得相同的复制操作.
或者您也可以声明

Foo(TestClass &X);
Run Code Online (Sandbox Code Playgroud)

并重新分配X地址.