【发布时间】:2020-01-05 10:50:46
【问题描述】:
我想构建一个衍生类对象的数组。我有这个基类:
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 个派生类,名为类 Lindt 和类 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;
}
如果我不知道类型(如果它是ChocAmor 对象或Lindt 中的candy.vec[i] 类型),我不确定如何为该vec[i] 分配内存。我应该得到一个辅助数组来存储该数组的类型吗?
【问题讨论】:
-
你想要的是一个对象的副本,你不知道它的确切类型。 virtual constructor 习惯用法有助于实现这一点。在基类中添加一个 clone 方法,然后在派生类中重写该方法,而在您卡住的地方,您将调用 Clone。
-
你应该使用虚函数来避免知道实际对象的类型。
标签: c++ class oop memory-management clone