Не работает конструктор класса

vasya00
Offline
Зарегистрирован: 30.05.2016

Подскажите, пожалуйста, что я делаю не так?

class Swich {
  public:
    uint8_t lamp_pin, pir_pin, light_pin, status_pin, close_pin;
    void use ();
    Swich(uint8_t light_pin, uint8_t lamp_pin, uint8_t pir_pin);  // описание конструктора
};

Swich::Swich(uint8_t light_pin, uint8_t lamp_pin, uint8_t pir_pin) { // конструктор
  Serial.println("!!!!!!!!!!");
}

void Swich::use () {
  Serial.println(light_pin);
  Serial.println(lamp_pin);
  Serial.println(pir_pin);
}

Swich s1 (1, 2, 3); // создаем экземпляр

void setup() {
  Serial.begin(9600);
}

void loop() {
  s1.use();
  delay(5000);
  Serial.println();
}

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

09   Serial.println("!!!!!!!!!!");

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vasya00 пишет:

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

С чего Вы взяли, что он не выполняется?

Не печатает? Так, правильно, он выполняется раньше Вашего setup, поэтому Serial еще не проинициализирован. Поставьте вместо строки 9 такие строки и убедитесь, что он вызывается.

pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);

А то, что Ваш конструктор никак не использует переданные ему парамметры, так используйте, кто Вам мешает?

vasya00
Offline
Зарегистрирован: 30.05.2016

Спасибо, с выводом точно! Как то не догадался.

ЕвгенийП пишет:

А то, что Ваш конструктор никак не использует переданные ему парамметры, так используйте, кто Вам мешает?

 А вот параметры не передает это точно. При выполнении процедуры use он печатает все три нуля, хотя там должны быть переданные конструктором параметры 1, 2, 3...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vasya00 пишет:

Спасибо, с выводом точно! Как то не догадался.

ЕвгенийП пишет:

А то, что Ваш конструктор никак не использует переданные ему парамметры, так используйте, кто Вам мешает?

 А вот параметры не передает это точно. При выполнении процедуры use он печатает все три нуля, хотя там должны быть переданные конструктором параметры 1, 2, 3...

Ещё раз: конструктор работает. И вызывается РАНЬШЕ инициализации Serial.begin. Как думаешь - будет ДО инициализации Serial что-нибудь в него выведено? Тебе уже сказали - зажги в конструкторе светодиод, и убедись, что конструктор вызывается. Разоблачитель покровов, блин.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vasya00 пишет:

 А вот параметры не передает это точно. При выполнении процедуры use он печатает все три нуля, хотя там должны быть переданные конструктором параметры 1, 2, 3...

А ты их где запоминаешь - ткни пальцем? То, что ты передаёшь параметры в конструктор - не делает их автоматически запоминаемыми в переменные экземпляра класса.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vasya00 пишет:

 А вот параметры не передает это точно. 

Передаёт - это точно. Аужчто с нимиделать. Вы сами решаете. Вы решили не делать ничего, вот с ними ничего и не делается.

vasya00
Offline
Зарегистрирован: 30.05.2016

Я же вроде выводить их пытался: Serial.println(light_pin); Но там нули

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
//------------------------------------------------
class Swich {
  protected:
    uint8_t  light_pin, lamp_pin, pir_pin;
  public:
    Swich(uint8_t p1, uint8_t p2, uint8_t p3);  // описание конструктора
    void use ();
};
Swich::Swich(uint8_t p1, uint8_t p2, uint8_t p3) // конструктор
  :  light_pin(p1), lamp_pin(p2), pir_pin(p3) {}
void Swich::use () {
  Serial.println(light_pin);
  Serial.println(lamp_pin);
  Serial.println(pir_pin);
}
//-----------------------------------------------
Swich s1 (/*light_pin*/1,/*lamp_pin*/ 2,/*pir_pin*/ 3); // создаем экземпляр

void setup() {
  Serial.begin(9600);
  s1.use();
}

void loop() {
}
/**/

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vasya00 пишет:

Я же вроде выводить их пытался: Serial.println(light_pin); Но там нули

Ещё раз: ответь на вопрос - ГДЕ ты сохраняешь переданные в конструктор класса параметры? Понимаешь, в чём проблема, нет? Ты в конструктор передаёшь параметры, но НИГДЕ их не сохраняешь. Может, стоит таки взять - и почитать, хоть чуть-чуть, основы С++?

В примере qwone постом выше строка 11 - это сохранение переданных в конструктор класса параметров в переменные класса. У тебя этого - нет, от слова "совсем".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vasya00 пишет:

Я же вроде выводить их пытался: Serial.println(light_pin); Но там нули

Что Вы пытались выводить? Параметры или свойства экземпляра класса? По-моему второе. А где Вы, простите, им что-либо присваиваете?

vasya00
Offline
Зарегистрирован: 30.05.2016

Ок понял спасибо!

class Swich {
  public:
    uint8_t lamp_pin, pir_pin, light_pin, status_pin, close_pin, a;
    void use ();
    Swich(uint8_t light_pin, uint8_t lamp_pin, uint8_t pir_pin);  // описание конструктора
};

Swich::Swich(uint8_t light_pin, uint8_t lamp_pin, uint8_t pir_pin)  // конструктор
  : light_pin(light_pin), lamp_pin(lamp_pin), pir_pin(pir_pin) {}

void Swich::use () {
  Serial.println(light_pin);
  Serial.println(lamp_pin);
  Serial.println(pir_pin);
}
  Swich s1 (1, 2, 3); // создаем экземпляр

void setup() {
  Serial.begin(9600);
}

void loop() {
  s1.use();
  delay(5000);
  Serial.println();
}

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

Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Молоток!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
Чунгачгук дважды на грабли не наступает, для второй раз лучше наступить на швабру,а потом на гвоздь, в грязь ну и так далее.

  : light_pin(light_pin), lamp_pin(lamp_pin), pir_pin(pir_pin) {}

Вот зачем входящие и переменные назвал одинакого. Похоже тупой это судьба.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

qwone пишет:

Чунгачгук дважды на грабли не наступает, для второй раз лучше наступить на швабру,а потом на гвоздь, в грязь ну и так далее.

  : light_pin(light_pin), lamp_pin(lamp_pin), pir_pin(pir_pin) {}

Вот зачем входящие и переменные назвал одинакого. Похоже тупой это судьба.

Квон - иногда лучше жевать...: https://stackoverflow.com/questions/6185020/initializing-member-variables-using-the-same-name-for-constructor-arguments-as-f/6185043#6185043

Всё легально, ибо - конструктор ;)

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Всё легально, ибо - конструктор ;)

DIYMan, по-моему Квон имел в виду не легальность или ошибку, а то, что называть разные  по смыслу переменные одним именем - это дурость, ведущая к путанице и ошибкам. И с такой манерой ТС, действительно, будет наступать на грабли, швабры и гвозди еще и еще.

Представь себе город, где в каждом районе есть своя улица Ленина. Ни один враг никогда не найдет засекреченных обьектов :)

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

DIYMan пишет:

Всё легально, ибо - конструктор ;)

DIYMan, по-моему Квон имел в виду не легальность или ошибку, а то, что называть разные  по смыслу переменные одним именем - это дурость, ведущая к путанице и ошибкам. И с такой манерой ТС, действительно, будет наступать на грабли, швабры и гвозди еще и еще.

Представь себе город, где в каждом районе есть своя улица Ленина. Ни один враг никогда не найдет засекреченных обьектов :)

А где там одно имя? Вижу, что там просто параметры, передаваемые в конструктор класса, называются так же, как и переменные класса. Это - совершенно легально с точки зрения стандарта С++, никаких граблей, кроме неудобства при чтении.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

Представь себе город, где в каждом районе есть своя улица Ленина. Ни один враг никогда не найдет засекреченных обьектов :)

С точки зрения секретности - лучше иметь три улицы Ленина в каждом городе, но никому об этом не говорить.

b707
Offline
Зарегистрирован: 26.05.2017

про секретность

Выпускник после института отправляется к месту работы - на секретное предприятие. Его инструктируют:

 - От вокзала сядешь на 12 автобус и доедешь до конечной. Увидишь серый ангар без вывески - это ОНО! Ни у кого не спрашивай, а то задержат, как шпиона.

Вот он приезжает, садится в автобус, едет до конечной... и слышит "Следующая остановка - Ракетный завод! Конечная!"

сорри, если баян

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

иметь три улицы Ленина в каждом городе, но никому об этом не говорить.

«Ибанов – это литературный псевдоним; настоящая его фамилия – Ибанов»
(А. Зиновьев «Зияющие высоты»)

 

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

«Ибанов – это литературный псевдоним; настоящая его фамилия – Ибанов»

(А. Зиновьев «Зияющие высоты»)

 

 (Алексей Михайлович Ридигер) "... принял решение принять монашество; (...........) он был пострижен с именем Алексий - в честь другого святого: не Алексия, человека Божия, именем которого был наречён в крещении, а Алексия, митрополита Киевского, святителя Московского."