如何在其他类中创建带参数构造函数的类对象及代码指导
问题分析与解决方案
你的核心需求是在main函数中初始化DataArea的数据,而不是把数值硬编码在Area类里,同时确保DataArea对象的创建是正确的。原代码的问题在于Area类里直接用new固定初始化了DataArea实例,导致所有Area对象的参数都是写死的,没法外部自定义,而且动态分配的指针还容易造成内存泄漏。
我来帮你调整代码,实现你想要的效果:
第一步:修正细节 + 调整类的依赖逻辑
首先注意到DataArea里的heigth拼写错误,应该是height,先修正这个小问题。然后我们让Area类通过构造函数接收外部的DataArea对象(或者直接接收参数初始化内部的DataArea),这样就能在main里完全控制数据初始化了。
第二步:修改后的完整代码
#include<iostream> using namespace std; class DataArea { public: int radius, length, width, base, height; // 修正拼写错误 // 用初始化列表构造,更规范高效 DataArea(int l, int w, int b, int h, int r) : length(l), width(w), base(b), height(h), radius(r) {} }; class Area { protected: // 调整访问权限,子类可访问,外部不可直接修改 DataArea data; // 直接持有对象,避免动态指针的内存泄漏风险 public: // Area构造函数,接收外部的DataArea对象完成初始化 Area(const DataArea& da) : data(da) {} float AreaCirle() { return 3.142 * data.radius * data.radius; } float AreaRectangle() { return data.length * data.width; } float AreaTraingle() { return (data.base * data.height) / 2.0f; // 加.0f避免整数除法丢失精度 } }; class print_data : public Area { public: // 子类构造函数,将参数传递给父类构造 print_data(const DataArea& da) : Area(da) {} void print() { cout << "Area of Circle is: " << AreaCirle() << endl; cout << "Area of Rectangle is: " << AreaRectangle() << endl; cout << "Area of Traingle is: " << AreaTraingle() << endl; } }; int main() { // 现在可以在main里自由定义DataArea的参数了! DataArea myCustomData(3, 4, 5, 6, 7); print_data areaPrinter(myCustomData); areaPrinter.print(); // 也可以直接临时构造DataArea传入,灵活度拉满 cout << "\n另一个自定义参数的实例结果:" << endl; print_data anotherPrinter(DataArea(10, 20, 15, 25, 5)); anotherPrinter.print(); return 0; }
关键调整点说明
- 替换动态指针:原代码用
new创建指针容易忘记释放内存,改成直接持有DataArea对象,更安全且无需手动管理内存。 - 构造函数传参:让
Area和子类print_data通过构造函数接收外部的DataArea对象,实现了main函数对数据初始化的控制权。 - 修复精度问题:三角形面积计算时用
/2.0f替代/2,避免两个整数相除导致的浮点数精度丢失。 - 优化封装性:把
Area的data成员设为protected,既保证子类能正常访问,又避免外部直接修改数据,符合面向对象的封装原则。
这样修改后,你就能完全在main函数中控制DataArea的初始化参数,对象的创建和使用逻辑也更清晰合理。
内容的提问来源于stack exchange,提问作者Muhammad Samiullah
相关产品推荐
相关产品推荐

