You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中实现可存储Shape派生类的自定义动态数组通用add_shape函数

解决自定义Shape容器的通用add_shape问题

嘿,这个问题核心其实是利用C++的多态特性来搞定,我来一步步帮你捋清楚:

第一步:修正动态数组的类型

你现在用的int **shape方向不对,我们需要存储的是Shape类的指针(因为派生类Rectangle、Circle的指针可以隐式转换为基类Shape*),所以正确的数组类型应该是:

Shape** shapes = new Shape*[capacity]; // capacity是初始容量,比如设为8

同时你需要两个变量来跟踪容器状态:

  • int size = 0;:当前已经存储的形状数量
  • int capacity = 8;:数组的总容量

第二步:实现通用的add_shape函数

这个函数的参数直接用基类指针Shape*就可以了——任何派生类(Rectangle、Circle)的指针都能传递给这个参数,完美实现通用添加逻辑。

另外要记得处理数组扩容:当size == capacity时,需要重新分配更大的内存,把旧数组的元素复制过去,再释放旧数组。

给你一个完整的容器类示例:

class ShapeContainer {
private:
    Shape** shapes;
    int size;
    int capacity;

    // 内部扩容函数
    void resize() {
        capacity *= 2; // 通常扩容为原来的2倍,平衡性能和内存
        Shape** new_shapes = new Shape*[capacity];
        // 复制旧数组里的所有形状指针
        for (int i = 0; i < size; ++i) {
            new_shapes[i] = shapes[i];
        }
        // 释放旧数组的内存
        delete[] shapes;
        shapes = new_shapes;
    }

public:
    ShapeContainer() : size(0), capacity(8) {
        shapes = new Shape*[capacity];
    }

    // 通用添加函数,接受任意Shape派生类指针
    void add_shape(Shape* shape) {
        if (size == capacity) {
            resize();
        }
        shapes[size++] = shape;
    }

    // 析构函数,必须清理内存避免泄漏
    ~ShapeContainer() {
        // 先逐个delete每个形状对象
        for (int i = 0; i < size; ++i) {
            delete shapes[i];
        }
        // 再delete指针数组本身
        delete[] shapes;
    }

    // 可选:获取指定索引的形状
    Shape* get_shape(int index) const {
        if (index >= 0 && index < size) {
            return shapes[index];
        }
        return nullptr;
    }
};

第三步:使用方式

这样你就能轻松添加任何Shape的派生类实例了:

ShapeContainer container;
container.add_shape(new Rectangle(10, 20)); // 假设Rectangle有对应构造函数
container.add_shape(new Circle(15)); // 假设Circle有对应构造函数

关键知识点

  • 利用多态特性:基类指针可以指向派生类对象,所以add_shape的参数用Shape*就能兼容所有派生类的实例指针。
  • 内存管理:一定要在析构函数里先逐个delete每个Shape对象,再delete指针数组,否则会造成内存泄漏。

内容的提问来源于stack exchange,提问作者simkass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:44:45