c++ - 如何在 C++ 中克隆未知动态类型的对象?

标签 c++ class oop memory-management clone

我想构建一个派生类对象数组。我有这个基类:

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/

相关文章:

c++ - g++4.9 libstdc++ std::string 对 C++11 的支持中断

c++ - 为什么在 sync_with_stdio(false) 之前使用 cin 给下一个 i/p 变量随机值

c++ - 全局列出对象并在 c/c++ 中添加类的本地对象

javascript - 无法在 ES6 类上调用静态函数

oop - 面向对象的 TCL

java - 有没有更好的方法来创建一个扩展另一个抽象类并添加新功能的抽象类?

c++ - 有没有办法避免隐式转换为 void*?

c++ - 类对象和指针的区别

java - 我如何将一个类的对象链接到 Java 中另一个类的对象?

c++ - C++中如何用getter方法实现封装