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

如何在其他类中创建带参数构造函数的类对象及代码指导

问题分析与解决方案

你的核心需求是在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:20