Конструктор по умолчанию - отложенная инициализация переменных-членов

Я ищу создать конструктор по умолчанию для моего объекта в 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)
{}
Другие вопросы по тегам