我想构建一个派生类对象数组。我有这个基类:
class CandyBox {
protected:
string flavor;
string origin;
public:
inline CandyBox();
inline CandyBox(string s1, string s2);
virtual float getVolume() = 0;
virtual void toString();
CandyBox& operator=(const CandyBox& obj);
virtual ~CandyBox() {}
};
以及 2 个名为 class
Lindt
的派生类和类(class)ChocAmor
构造函数和方法也是如此。我现在正在尝试建立一个像这样的沙哑列表:CandyBox** vec = new CandyBox*[n];
for (int i = 0; i < n; i++) {
cin >> type;
if (strcmp(type, "ChocAmor") == 0) {
vec[i] = new ChocAmor(1, "s", "ro");
}
else vec[i] = new Lindt(1, 2, 3, "f", "it");
}
我的问题是:如果我想创建另一个名为
CandyBag
的类怎么办?包含这样的属性 CandyBox** vec = new CandyBox*[n];
我需要这个方法:CandyBag& operator=(const CandyBag& candy) {
ChocAmor::operator=(candy);
Lindt::operator=(candy);
dim_max = candy.dim_max;
current_dim = candy.current_dim;
vec = new CandyBox*[candy.dim_max];
for (int i = 0; i <= current_dim; i++) {
vec[i] = new ; //HERE I'M STUCK
// because I can't just simply write vec[i] = candy.vec[i], right?
// I need to allocate memory for that vec[i] first
}
return *this;
}
我不确定如何为
vec[i]
分配内存如果我不知道类型(如果它是 ChocAmor
对象或 Lindt
类型中的 candy.vec[i]
)。我应该得到一个辅助数组来存储该数组的类型吗?
最佳答案
所有指向类类型的指针都具有相同的大小和表示形式。这对于不透明指针的工作至关重要。
如果要启用克隆指向的对象,请添加虚拟 .clone()
到接口(interface),和/或编写自己的复制智能指针。
拖着指向克隆函数的指针或维护从 typeid 到克隆函数的映射会更加麻烦,尽管在其他情况下可能是正确的解决方案。
否则,我有一个建议:
使用智能指针,最好是 std::unique_ptr
, 和标准容器,最好是 std::vector
,以避免手动内存管理并获得使用标准类型的所有相关好处。
关于c++ - 如何在 C++ 中克隆未知动态类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59599100/