Конструктор по умолчанию - отложенная инициализация переменных-членов
Я ищу создать конструктор по умолчанию для моего объекта в C++, который при вызове просто вызывает другой конструктор, но с фиксированными значениями.
Я смотрел на подобные проблемы: конструкторы по умолчанию вызывается автоматически для переменных-членов? и явно заданные по умолчанию конструкторы и инициализация переменных-членов, которые указывают, что когда вызывается конструктор по умолчанию, также вызываются конструкторы по умолчанию для переменных-членов, если они не указаны.
Однако проблема, с которой я столкнулся, состоит в том, что переменные-члены (из библиотеки 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 ответ
Для этого вы можете использовать функцию делегирования конструкторов 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
}
Другой вариант, как упоминает Cheers and hth. - 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)
{}