【问题标题】:C++ add object with overloaded constructor to another objectC ++将具有重载构造函数的对象添加到另一个对象
【发布时间】: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


【解决方案1】:

在 addWaterSenor 中,您的对象在本地范围内被声明和创建,并且在函数返回后将不再存在。将新的 WaterSensor 分配给已作为类成员存在的 waterSensor,而无需声明新的本地。

waterSensor = WaterLevelSensor(reversedLogic);

【讨论】:

    【解决方案2】:

    您正在尝试从另一个类 Pump 修改 WaterLevelSensor 中的私有类变量。

    WaterLevelSensor 中创建setLogic(...) 函数将是最好的解决方案。但作为替代方案,您可以将Pump 声明为WaterLevelSensor 的朋友。

    class Pump; // forward declaration
    
    class WaterLevelSensor {
      private:
        friend class Pump; // make Pump a friend
        bool _waterLevelOK;
        bool _reversedLogic;
      public:
        WaterLevelSensor(void);
        WaterLevelSensor(bool reversedLogic);
    };
    
    class Pump {
      private:
        bool _hasWaterSensor = false;
        WaterLevelSensor waterSensor;
      public:
        Pump(void);
        void addWaterSensor(bool reversedLogic);
    };
    
    void Pump::addWaterSensor(bool reversedLogic)
    {
      waterSensor._reversedLogic = reversedLogic;
      _hasWaterSensor = true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多