C++中float与自定义类相加返回float失败问题求助
问题分析与解决
你的代码无法正常运行主要有几个关键问题,逐个拆解如下:
1. 最致命的错误:函数声明而非对象实例化
代码里的 Sensors tested(); 并不是创建一个Sensors类的对象,而是声明了一个名为tested、返回Sensors类型的无参函数——这是C++的语法规则,括号会被解析为函数声明的标志。
要创建对象,应该写成:
Sensors tested; // 或者C++11及以后推荐的方式 Sensors tested{};
2. 成员变量未初始化,相加结果无意义
Sensors类的value成员是私有变量,且没有默认初始化值(只有valid设了默认false)。就算你创建了对象,value的值是未定义的垃圾值,相加后的结果完全无效。
需要给类添加构造函数来初始化成员:
class Sensors { public: // 构造函数,可选参数初始化传感器类型和数值 Sensors(int sensorType = INVALID, float val = 0.0f) : type(sensorType), value(val), valid(sensorType != INVALID) {} // 原有友元声明... };
3. 枚举常量拼写错误
枚举里的 HUMIDTY 少写了一个字母I,应该是 HUMIDITY,否则后续判断传感器类型时会出现逻辑错误。
4. operator<<的逻辑缺陷
当前的输出重载函数中,如果传感器类型是INVALID,会错误显示为"Humidity",需要补充判断逻辑:
ostream& operator<<(ostream& OutStream, const Sensors& OutComp) { if (OutComp.type == TEMPERATURE) { OutStream << " Type: Temperature"; } else if (OutComp.type == HUMIDITY) { OutStream << " Type: Humidity"; } else { OutStream << " Type: Invalid"; } OutStream << " Value: " << OutComp.value << endl; return OutStream; }
修正后的完整代码
#include <iostream> #include <cstdint> using namespace std; #define MAX_NUM_SENSORS 5 enum { INVALID, TEMPERATURE, HUMIDITY }; // 修正拼写 class Sensors { public: // 添加构造函数初始化成员 Sensors(int sensorType = INVALID, float val = 0.0f) : type(sensorType), value(val), valid(sensorType != INVALID) {} friend ostream& operator <<(ostream&, const Sensors&); friend float operator+ (float,const Sensors&); private: int type; float value; bool valid = false; }; ostream& operator<<(ostream& OutStream, const Sensors& OutComp) { // 完善类型判断逻辑 if (OutComp.type == TEMPERATURE) { OutStream << " Type: Temperature"; } else if (OutComp.type == HUMIDITY) { OutStream << " Type: Humidity"; } else { OutStream << " Type: Invalid"; } OutStream << " Value: " << OutComp.value << endl; return OutStream; } float operator+ (float adding, const Sensors& added) { return added.value + adding; } int main() { Sensors tested(TEMPERATURE, 36.5f); // 创建初始化后的传感器对象 float m = 1.2 + tested; cout << m << endl; // 输出37.7 cout << tested; // 输出传感器详细信息 return 0; // 主函数正常返回0 }
内容的提问来源于stack exchange,提问作者DT Nam LE
相关产品推荐
相关产品推荐

