Инициализация частного члена в конструкторе - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь заставить светиться мерцание светодиода, имитирующего свечу.Я очень очень мало знаю о C ++.

У меня есть класс с именем CandleAnimation, созданный со ссылкой на объект, который управляет светодиодом.Я хотел бы создать Candle объект, который поддерживает состояние моделируемой свечи.

Цикл выполнения вызывает метод animate для CandleAnimation.Я не уверен, что именно здесь происходит, но кажется, что мой Candle выходит из области видимости и разрушается.

#include "candle_animation.h"

CandleAnimation::CandleAnimation(Led *led, Color flameColor) {
  _led = led;

  Candle candle(_led, 0xFF0000);
  _candle = &candle;

  _candle->play(); // shows red as expected
  delay(500); // this prevents the run loop from starting so I have to delete this code to get the animate to work
}

void CandleAnimation::animate(int sliderValue, int ambientBrightness) {
  Candle otherCandle(_led, 0x00FF00);
  otherCandle.play(); // shows green as expected

  delay(500); // this stops the following code from being random actually.  instead it's a dim green on the LED

  _candle->play(); // shows grazy things . . . seemingly random
}

Итак, как мне инициализировать мой экземпляр с помощью указателяк объекту и держать этот объект вокруг, чтобы я мог использовать его в других методах-членах?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018
CandleAnimation::CandleAnimation(Led *led, Color flameColor)
    : _candle(new Candle(led, 0xFF0000)) // this is making you sure that your candle will be valid until being deleted
{
  _led = led;

  //  Candle candle(_led, 0xFF0000); this is a local variable and will be deleted after constructor execution. You don't need it anymore
  //  _candle = &candle;

  _candle->play(); // shows red as expected
  delay(500); // this prevents the run loop from starting so I have to delete this code to get the animate to work
}
// don't forget to delete _candle in destructor
0 голосов
/ 17 декабря 2018

Если вы хотите сохранить правильный объект-свечу в своем классе, используйте это в заголовке:

Led* _led;
Candle _candle;

В этом случае конструктор становится:

CandleAnimation::CandleAnimation(Led *led, Color flameColor)
: _led(led)
, _candle(led, 0xFF0000)
{
   // Rest of the constructor
}

Если вы хотитечтобы придерживаться динамического выделения (вы этого не сделаете), объявите _candle как unique_ptr:

std::unique_ptr<Candle > _candle ;

И затем (если у вас есть C ++ 14):

_candle  = std::make_unique(_led, 0xFF0000);

В C ++ 11:

_candle  = std::unique_ptr(new Candle(_led, 0xFF0000));

Если у вас нет современного C ++ (не знаете, что предлагает arduino?), Вам нужно сделать то же самое, но отслеживать время жизни _candle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...