Как инициализировать элементы, используя информацию из конструктора - PullRequest
0 голосов
/ 22 марта 2020

у меня 5 кнопок. Я создаю структуру, чтобы описать их. Они используют JLed и CapacitiveSensor.

Итак, вот мой план:

struct Button
{
  long capThreshold = 200;
  long maxLedBrightness;
  Button(uint8_t capPin, byte ledPin, byte maxLedBrightness_)
  {
    auto led = JLed(ledPin);
    auto capSensor = CapacitiveSensor(2, capPin);
    capSensor.set_CS_Timeout_Millis(50);
    maxLedBrightness = maxLedBrightness_;
  }
};

Button buttons[5] = {
    Button(A0, 3, 45),
    Button(A1, 5, 255),
    Button(A2, 6, 30),
    Button(A3, 9, 100),
    Button(A4, 10, 100)};

Это не работает. Я пытаюсь использовать это:

  for (byte i = 0; i < 4; i++)
  {
    buttons[i].led.Update();
  }

Затем мне говорят, что class "Button" has no member "led". Итак, я считаю, что здесь происходит то, что элемент инициализируется в конструкторе, что означает, что он не доступен извне. Итак, я в значительной степени нахожусь с проблемой, описанной здесь . Решение состоит в том, чтобы инициализировать указатель на член, а затем заполнить содержимое указателя в конструкторе.

Я действительно не хочу этого делать. Я не хочу иметь дело с запоминанием того, что является и не является указателем. Я не хочу иногда использовать -> вместо .. Кроме того, звучит так, будто мне придется иметь дело с разрушением. Я не хочу, чтобы эта относительно незначительная проблема вызывала головные боли во всей программе.

Можно ли как-нибудь избежать этого?


Редактировать: Позвольте мне перефразировать мою проблему. Я думаю, что есть недоразумение. Я понимаю, что переменные, инициализированные в конструкторе, не являются членами. Я понимаю, что с нормальной переменной я мог бы объявить член, а затем изменить его в конструкторе. Проблема в том, что я не могу объявить эти переменные вне конструктора, потому что информацию, которую мне нужно передать в их конструкторах, мне нужно получить из моего конструктора.

1 Ответ

0 голосов
/ 22 марта 2020

Нет проблем инициализировать элементы в конструкторе, даже когда необходимы параметры конструктора. Для этого используется список инициализаторов .

struct Button
{
    JLed lid;
    CapacitiveSensor capSensor;
    long maxLedBrightness;

    Button(uint8_t capPin, byte ledPin, byte maxLedBrightness_):
        lid(ledPin),
        capSensor(2, capPin),
        maxLedBrightness(maxLedBrightness_)
    {
        capSensor.set_CS_Timeout_Millis(50);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...