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

C++从另一类初始化类属性报错,求代码修正及开发实践优化建议

错误原因

你为VehicleInfo自定义了三参数构造函数后,C++编译器不会再自动生成默认无参构造函数。而Vehicle类的现有构造函数中,vehicle成员是在构造函数体内赋值的:进入构造函数体前,所有类成员会先执行默认初始化,VehicleInfo没有无参构造函数,因此触发编译报错。

修复方案

改用成员初始化列表初始化Vehicle类的所有成员,跳过默认初始化步骤,直接调用VehicleInfo的拷贝构造函数完成初始化,同时修正getTax返回值类型不匹配的问题:
把Vehicle的构造函数修改为:

Vehicle(string id, string license_plate, VehicleInfo vehicle) 
    : id(std::move(id))
    , license_plate(std::move(license_plate))
    , vehicle(std::move(vehicle))
{
    // 无需再在函数体内赋值
}
// 同时修改getTax返回值类型,避免精度丢失
float getTax() const {
    return vehicle.compute_tax();
}

修改后即可正常编译运行。

代码优化建议
  • 移除不必要的头文件:你代码中没有用到<fstream>、<math.h>,宏定义M_PI也没有使用,直接删除可减少编译开销。
  • 避免全局导入using namespace std;:全局导入标准命名空间容易引发命名冲突,建议显式加std::前缀。
  • 封装类成员变量:不要将类的成员变量设为public,改为private权限,仅对外提供必要的getter方法,符合OOP封装原则。
  • 为不修改成员的函数加const修饰:比如compute_tax()、print_vehicle_info()、getName()等不会修改类成员的方法,末尾加const修饰,既可以避免意外修改成员,也支持const实例调用该方法。
  • 优化成员命名:不要在成员函数中用类名::的方式访问自身成员,可给成员变量加统一前缀(比如m_)避免和参数重名,代码可读性更高。
  • tax_percentage无需作为成员变量:它是税率计算的固定参数,直接在compute_tax函数内定义常量即可,无需占用类实例的存储空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:06:03