2015-04-24 3 views
1

Я ищу, чтобы создать конструктор по умолчанию для моего объекта в C++, который при вызове просто вызывает другой конструктор, но с фиксированными значениями.По умолчанию Constructor - отсрочка инициализации переменных-членов

Я смотрел на аналогичные проблемы: 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 
} 
+2

Вы можете [делегат] (http://stackoverflow.com/questions/13961037/delegate-constructor-c) конструктор по умолчанию использовать параметризованный конструктор. – NathanOliver

+0

Почему бы вам просто не присваивать значения по умолчанию второму конструктору и сделать конструктор по умолчанию закрытым? – user3528438

+0

Я ценю, что мог бы это сделать, но a) Я действительно не хочу повторять логический код в другом конструкторе и b) Я хочу знать, теоретически, это можно сделать :) – davidhood2

ответ

2

Вы можете использовать 11 C++ делегирует Конструкторы имеют для этого.

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 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) 
{} 
+0

это можно сделать без C++ 11? – davidhood2

+1

@ davidhood2: В C++ 03 вы можете делегировать искусственный базовый класс. –

+2

@ davidhood2 Вы можете либо добавить функцию члена 'Init()' (возможно, 'private'), либо делегировать какой-либо базовый класс, поскольку Alf предлагает – Praetorian

Смежные вопросы