【发布时间】:2019-12-06 20:25:41
【问题描述】:
我对 C++ 非常陌生,因此对于标题中的错误且可能造成混淆的术语表示歉意。很想知道这叫什么。
我正在尝试将具有重载构造函数的对象添加到另一个对象。但是,它总是采用默认构造函数而不是我重载的构造函数。
考虑以下场景。我有一个带有可选水位传感器的水泵。我的水位传感器有一个单独的课程。
class WaterLevelSensor{
private:
bool _waterLevelOK;
bool _reversedLogic;
public:
WaterLevelSensor();
WaterLevelSensor(bool reversedLogic);
};
WaterLevelSensor::WaterLevelSensor(){
_reversedLogic = true;
}
WaterLevelSensor::WaterLevelSensor(bool reversedLogic){
_reversedLogic = reversedLogic;
}
还有一个泵类
class Pump{
private:
bool _hasWaterSensor = false;
WaterLevelSensor waterSensor;
public:
Pump();
void addWaterSensor(reversedLogic);
};
Pump::Pump(){}
void Pump::addWaterSensor(reversedLogic){
WaterLevelSensor waterSensor(reversedLogic);
_hasWaterSensor = true;
}
如果我执行以下操作,即使我传递了 false,水传感器仍将具有 reversedLogic == true。我认为这是由于在创建泵期间已经调用了传感器的默认构造函数,传递了 reversedLogic = true。我将如何解决这个问题?我确实意识到我可以通过创建一个像 setLogic() 这样允许更改变量的函数来修复它。但我只是好奇如果不创建这个问题的正确解决方案是什么。
int main(){
Pump pump;
pump.addWaterSensor(false);
return 0;
}
【问题讨论】:
-
请注意,您不需要两个构造函数。
WaterLevelSensor(bool reversedLogic = true);应该够了 -
另外,
void addWaterSensor(reversedLogic)不应该是:void Pump::addWaterSensor(bool reversedLogic)? -
啊,我以为我不能传递这样的默认值,这很方便,谢谢!是的,确实必须如此,很好的收获。当我输入这个最小的示例代码时忘记了。
标签: c++ class object constructor