默认构造函数 - 推迟成员变量的初始化

时间:2015-04-24 13:08:14

标签: c++ object constructor default-constructor

我希望在C ++中为我的对象创建一个默认构造函数,当调用它时,它只调用另一个构造函数但是具有固定值。

我一直在研究类似的问题: Are default constructors called automatically for member variables?Explicitly defaulted constructors and initialisation of member variables 这表明,当调用默认构造函数时,除非指定,否则也会调用成员变量的默认构造函数。

但是,我遇到的问题是我使用的成员变量(来自ARMmbed库)没有默认构造函数 - 因此这不起作用。

有没有办法延迟"这个问题,因为,在默认构造函数调用的构造函数中,所有这些成员变量都被分配给它并且一切都解决了 - 有没有办法让编译器知道这个?

非常感谢!

我正在使用的标题和实现代码如下!

class Motor: public PwmOut
{
public:
    //Constructor of 2 pins, and initial enable value
    Motor(); //Default constructor
    Motor(PinName dutyPin, PinName enable_pin, bool enable);  
private:
    bool enable; //Boolean value of enable
    DigitalOut enablePin; //Digital out of enable value
};

实现:

/**
* Default constructor
**/
Motor::Motor() //I don't want to initialise member variables here
{
    this = Motor::Motor(p23,p24,true); //As they are initialised in this constructor anyway?
}
/**
* Constructor for Motor class. Takes 1 PwmOut pin for PwmOut base class and 1 pin for DigitalOut enable
**/
Motor::Motor(PinName dutyPin, PinName enable_pin, bool enable):
    PwmOut(dutyPin), enablePin(enable_pin)
{
    //Logic in here - don't really want to duplicate to default constructor
}

1 个答案:

答案 0 :(得分:2)

您可以使用C ++ 11的委托构造函数功能。

Motor::Motor()
: Motor(p23,p24,true)
{}

如果您的编译器不支持,那么您必须初始化mem-initializer列表中的数据成员,并将您不想重复的逻辑移动到另一个函数。

Motor::Motor()
: PwmOut(p23), enablePin(p24), enable(true)
{
    Init();
}

Motor::Motor(PinName dutyPin, PinName enable_pin, bool enable):
    PwmOut(dutyPin), enablePin(enable_pin), enable(enable)
{
    Init();
}

Motor::Init()
{
  // Move the initialization logic in here
}

另一个选项,如注释中提到的Alf,是引入一个可以将构造委托给的基类。

class MotorBase
{
public:
    MotorBase(PinName enable_pin, bool enable)
    : enable(enable), enablePin(enable_pin)
    {
       // initialization logic goes in here
    }
private:
    bool enable; //Boolean value of enable
    DigitalOut enablePin; //Digital out of enable value
};

class Motor : public PwmOut, MotorBase
{
public:
    Motor(); //Default constructor
    Motor(PinName dutyPin, PinName enable_pin, bool enable);
};

Motor::Motor()
: PwmOut(p23), MotorBase(p24, true)
{}

Motor::Motor(PinName dutyPin, PinName enable_pin, bool enable):
    PwmOut(dutyPin), MotorBase(enable_pin, enable)
{}