C ++将具有重载构造函数的对象添加到另一个对象

Posted

技术标签:

【中文标题】C ++将具有重载构造函数的对象添加到另一个对象【英文标题】:C++ add object with overloaded constructor to another object 【发布时间】: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) 啊,我以为我不能传递这样的默认值,这很方便,谢谢!是的,确实必须如此,很好的收获。当我输入这个最小的示例代码时忘记了。 【参考方案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;

【讨论】:

以上是关于C ++将具有重载构造函数的对象添加到另一个对象的主要内容,如果未能解决你的问题,请参考以下文章

c++_构造与析构

c++_构造与析构

在运行时将一个游戏对象组件添加到另一个具有值的游戏对象中

稍微深入点理解C++复制控制转

黑马程序员 C++教程从0到1入门编程笔记4C++核心编程(类和对象——封装权限对象的初始化和清理构造函数析构函数深拷贝浅拷贝初始化列表友元friend运算符重载)

C++ 中构造函数的对象初始化问题[关闭]