交换多边形对象



我有一个基类a和派生类B。我希望能够交换它们所指向的对象。在指针的底层基对象上应用std::swap只交换基对象内容,而不交换派生对象的内容。如何修复该问题以使std::swap正常工作。

#include <iostream>
#include <memory>

class A {
public:
void setA(unsigned int value) { *a = value; }
unsigned int getA() { return *a; }
virtual void h(){}
protected:
std::unique_ptr<unsigned int> a = std::make_unique<unsigned int>();
};
class B : public A {
public:
void setB(unsigned int value) { *b = value; }
unsigned int getB() { return *b; }
protected:
std::unique_ptr<unsigned int> b = std::make_unique<unsigned int>();
};

int main() {
std::unique_ptr<A> oA = std::make_unique<B>();
oA->setA(100);
auto a = dynamic_cast<B*>(oA.get());
a->setB(30);

std::unique_ptr<A> oB = std::make_unique<B>();
oB->setA(1000);
std::swap(*oA.get(), *oB.get());
std::cout << dynamic_cast<B*>(oB.get())->getB() << std::endl;
std::cout << dynamic_cast<B*>(oA.get())->getB() << std::endl;
std::cout << dynamic_cast<B*>(oA.get())->getA() << std::endl;
return 0;
}

在本例中,有两个名为abA*变量(误导性地(,它们都指向B对象。您希望std::swap(*a, *b)交换完整的B对象。如果你有办法做到这一点,那么如果a实际上指向A类型的对象,你希望它做什么?

不能交换AB,因为对象的大小不同。您需要将"B"对象放在"A"曾经所在的位置,但内存中没有足够的空间。

当然,您可以交换指针本身:std::swap(a, b)可以正常工作。

相关内容

最新更新