结构体何时需要默认构造函数?附代码报错场景咨询
问题原因与解决方法
为什么会报错?
当你在Character类里定义HP hp;这个成员变量后,在Character构造函数的执行体代码运行之前,C会自动完成所有成员变量的初始化操作。此时因为你没有显式指定hp的初始化方式,编译器会尝试调用HP的默认构造函数(无参数的构造函数)来创建这个对象,但你只给HP编写了带int参数的构造函数,C编译器不会为已经有自定义构造函数的类自动生成默认构造函数,因此就触发了Error C2512错误。
你在构造函数里写的this->hp = HP(hp);属于赋值操作,不是初始化——这行代码是在hp已经被尝试默认初始化(失败)之后才会执行的,所以它解决不了初始化阶段的问题。
两种解决办法
办法1:给HP添加默认构造函数
把你注释掉的默认构造函数放开即可,也可以给它加上默认初始化逻辑:struct HP { int max_hp; int hp; HP() : max_hp(0), hp(0) {}; // 显式定义默认构造函数 HP(int max_hp) { this->max_hp=max_hp; this->hp=max_hp; } };办法2:使用成员初始化列表直接初始化HP
修改Character的构造函数,通过初始化列表直接调用HP的带参构造函数,跳过默认初始化步骤:Character::Character(int hp) : hp(hp) {}这种方式更高效,因为它直接完成成员的初始化,避免了先默认构造再赋值的额外开销,同时也不需要HP的默认构造函数。
内容的提问来源于stack exchange,提问作者Jack Lee
相关产品推荐
相关产品推荐

