我有一个关于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
可能的解决方案:
复制内存:
memcpy(this, B, sizeof(TestClass));
Run Code Online (Sandbox Code Playgroud)
此方法正常工作.该函数将对象B的每个位复制到对象A中.
问题:如果TestClass是一个大对象(并且它是),它会为多个Foo调用创建显着的性能开销.
从函数返回一个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.
我怎么能这样做= B.
你不能.
其中一个工作解决方案:memcpy(this,B,sizeof(TestClass)); 这种方法工作正常.
如果TestClass不是POD,则此功能不起作用.例如,您无法使用虚函数记忆对象.你会吹掉vtable.
在你的功能里面,你可以做到
*this = B;
Run Code Online (Sandbox Code Playgroud)
这使得相同的复制操作.
或者您也可以声明
Foo(TestClass &X);
Run Code Online (Sandbox Code Playgroud)
并重新分配X地址.