默认构造函数 - 推迟成员变量的初始化
Default Constructor - deferring initialisation of member variables
我希望在 C++ 中为我的对象创建一个默认构造函数,当调用它时,它只是调用另一个具有固定值的构造函数。
我一直在寻找类似的问题:
Are default constructors called automatically for member variables? 和
Explicitly defaulted constructors and initialisation of member variables
这表明,当调用默认构造函数时,成员变量的默认构造函数,除非指定,否则也会被调用。
但是,我遇到的问题是我正在使用的成员变量(来自 ARMmbed 库)没有默认构造函数 - 因此这不起作用。
有没有办法解决"delay"这个问题,因为在默认构造函数调用的构造函数中,所有这些成员变量都被分配给了并且都解决了 - 有没有办法让编译器知道这个?
非常感谢!
下面是我使用的头文件和实现代码!
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
}
您可以为此使用 C++11 的委托构造函数功能。
Motor::Motor()
: Motor(p23,p24,true)
{}
如果您的编译器不支持,那么您必须在内存初始化器列表中初始化数据成员,并将您不想重复的逻辑移动到另一个函数。
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,您可以将构造委托给它。
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)
{}
我希望在 C++ 中为我的对象创建一个默认构造函数,当调用它时,它只是调用另一个具有固定值的构造函数。
我一直在寻找类似的问题: Are default constructors called automatically for member variables? 和 Explicitly defaulted constructors and initialisation of member variables 这表明,当调用默认构造函数时,成员变量的默认构造函数,除非指定,否则也会被调用。
但是,我遇到的问题是我正在使用的成员变量(来自 ARMmbed 库)没有默认构造函数 - 因此这不起作用。
有没有办法解决"delay"这个问题,因为在默认构造函数调用的构造函数中,所有这些成员变量都被分配给了并且都解决了 - 有没有办法让编译器知道这个?
非常感谢!
下面是我使用的头文件和实现代码!
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
}
您可以为此使用 C++11 的委托构造函数功能。
Motor::Motor()
: Motor(p23,p24,true)
{}
如果您的编译器不支持,那么您必须在内存初始化器列表中初始化数据成员,并将您不想重复的逻辑移动到另一个函数。
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,您可以将构造委托给它。
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)
{}