如何在 C++ 中克隆未知动态类型的对象?
How to clone objects of unknown dynamic type in C++?
我想构建一个派生的 class 对象数组。我有这个基础 class:
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 命名为 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
的 class 并包含类似 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;
}
如果我不知道类型(如果它是 ChocAmor
对象或 Lindt
类型,我不确定如何为 vec[i]
分配内存candy.vec[i]
)。我应该得到一个辅助数组来存储该数组的类型吗?
所有指向 class 类型的指针都具有相同的大小和表示形式。这对于不透明指针的工作至关重要。
如果要启用对指向对象的克隆,请在接口中添加一个虚拟.clone()
,and/or编写您自己的复制智能指针。
拖着指向克隆函数的指针或维护从 typeid 到克隆函数的映射会更加麻烦,但在其他情况下可能是正确的解决方案。
否则我有一个建议:
使用智能指针(最好 std::unique_ptr
)和标准容器(最好 std::vector
)以避免手动内存管理并获得使用标准类型的所有相关好处。
我想构建一个派生的 class 对象数组。我有这个基础 class:
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 命名为 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
的 class 并包含类似 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;
}
如果我不知道类型(如果它是 ChocAmor
对象或 Lindt
类型,我不确定如何为 vec[i]
分配内存candy.vec[i]
)。我应该得到一个辅助数组来存储该数组的类型吗?
所有指向 class 类型的指针都具有相同的大小和表示形式。这对于不透明指针的工作至关重要。
如果要启用对指向对象的克隆,请在接口中添加一个虚拟.clone()
,and/or编写您自己的复制智能指针。
拖着指向克隆函数的指针或维护从 typeid 到克隆函数的映射会更加麻烦,但在其他情况下可能是正确的解决方案。
否则我有一个建议:
使用智能指针(最好 std::unique_ptr
)和标准容器(最好 std::vector
)以避免手动内存管理并获得使用标准类型的所有相关好处。