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
相关产品推荐
相关产品推荐

