具有抽象 class 指针的对象的 C++ 副本
C++ copies of objects with abstract class pointers
考虑 Container
class,它基本上存储 Box
个对象的 unique_ptr
个向量,并可以对它们执行一些计算。
class Container
{
private:
std::vector<std::unique_ptr<Box> > boxes_;
public:
Container(std::vector<std::unique_ptr<Box> > &&boxes): boxes_(std::move(boxes)){}
double TotalVolume() { /* Iterate over this->boxes_ and sum */ }
};
这里,Box
是一个抽象class,它有一个纯虚方法,例如double Box::Volume()
。
现在,假设我在主程序中实例化一个容器为:
std::vector<std::unique_ptr<Box> > x;
x.push_back(std::move(std::unique_ptr<Box>(new SquareBox(1.0)));
x.push_back(std::move(std::unique_ptr<Box>(new RectangularBox(1.0, 2.0, 3.0)));
Container c(x);
如何制作 c
的副本?我想要一个在 boxes_
中复制底层 Box
对象的函数,但我认为很难用基数 classes?
做到这一点
制作副本的一种方法是在基础 class 中使用 "Copy" 虚方法。此方法将创建当前对象的副本和 return 指向它的(唯一)指针。如果 class 中有任何包含的指针,它们也需要创建新副本(深层副本)。
存在其他方法。例如,您可以测试向量中的每个对象以确定其类型(使用 dynamic_cast
),但这样做很丑陋、效率低下并且很容易出错。
考虑 Container
class,它基本上存储 Box
个对象的 unique_ptr
个向量,并可以对它们执行一些计算。
class Container
{
private:
std::vector<std::unique_ptr<Box> > boxes_;
public:
Container(std::vector<std::unique_ptr<Box> > &&boxes): boxes_(std::move(boxes)){}
double TotalVolume() { /* Iterate over this->boxes_ and sum */ }
};
这里,Box
是一个抽象class,它有一个纯虚方法,例如double Box::Volume()
。
现在,假设我在主程序中实例化一个容器为:
std::vector<std::unique_ptr<Box> > x;
x.push_back(std::move(std::unique_ptr<Box>(new SquareBox(1.0)));
x.push_back(std::move(std::unique_ptr<Box>(new RectangularBox(1.0, 2.0, 3.0)));
Container c(x);
如何制作 c
的副本?我想要一个在 boxes_
中复制底层 Box
对象的函数,但我认为很难用基数 classes?
制作副本的一种方法是在基础 class 中使用 "Copy" 虚方法。此方法将创建当前对象的副本和 return 指向它的(唯一)指针。如果 class 中有任何包含的指针,它们也需要创建新副本(深层副本)。
存在其他方法。例如,您可以测试向量中的每个对象以确定其类型(使用 dynamic_cast
),但这样做很丑陋、效率低下并且很容易出错。