【问题标题】:How to clone objects of unknown dynamic type in C++?如何在 C++ 中克隆未知动态类型的对象?
【发布时间】: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


【解决方案1】:

所有指向类类型的指针都具有相同的大小和表示形式。这对于不透明指针的工作至关重要。

如果您想启用克隆指向的对象,请将虚拟.clone() 添加到接口,和/或编写您自己的复制智能指针。 拖着指向克隆函数的指针或维护从 typeid 到克隆函数的映射会更加麻烦,但在其他情况下可能是正确的解决方案。

否则,我有一个建议:

使用智能指针(最好是std::unique_ptr)和标准容器(最好是std::vector)来避免手动内存管理并获得使用标准类型的所有相关好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2011-05-15
    • 2011-02-04
    • 2013-02-18
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多