c++ - 如何在对象成员函数中重新分配 `this` 指针?

标签 c++ pointers this

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

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

原来是这样的。我有一个 C++ 类 TestClass,我有一个这种类型的指针 A:

TestClass* A = new TestClass();

除其他事项外,TestClass 具有以下功能:

void TestClass::Foo(){
    TestClass* B = new TestClass();
    ...
}

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

在这个函数的最后,我希望指针 A 指向对象 B。 在这个函数之外的任何地方它看起来像 A=B;在这个函数里面 它可能看起来像 this = B
但如您所知,您不能重新分配“this”指针。

可能的解决方案:

  1. 复制内存:

    memcpy(this, B, sizeof(TestClass));
    

    此方法工作正常。该函数将对象 B 的每一位复制到对象 A 中。
    问题:如果 TestClass 是一个大对象(确实如此),它会在多个 Foo 调用的性能上产生显着的开销。

  2. 从函数返回一个 B 指针并做类似这样的事情

    Temp = A;
    A=A->Foo();
    freeMemory(Temp);
    

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

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

最佳答案

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

class TestClass
{
private:
  TestClassData* m_data;

};

void TestClass::Foo()
{
  TestClassData* B = new TestClassData();
  ... 
  delete m_data;
  m_data = B;
} 

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

关于c++ - 如何在对象成员函数中重新分配 `this` 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2050044/

相关文章:

c - C 中的 strend 函数使用指针?

javascript - 使用 "this"创建构造函数而不是简单地返回对象

c++ - 读取 string 的字符时出错。分配内存

c++ - 什么时候绑定(bind)到 VAO?

c - 在C中动态分配内存给常量char指针?

c++ - 为什么以及何时通过指针在 C++ 中传递类类型?

c++ - istream 在 DEV C++ 中不工作

c++ - 带状态栏的对话框

java - 为什么 this.super() 在 Java 中不可能?