Классы и объекты в Arduino
- Войдите на сайт для отправки комментариев
Пт, 10/04/2015 - 16:26
Добрый день всем!
Возник такой вопрос.
Правильно ли я понимаю, что при программировании Arduino нельзя создать свои классы и объекты в самой программе? Только с помощью библиотеки?
И Arduino не поддерживает сам в чистом виде ООП?
Создать новый скетч, сохранить его, например с именем Blinker, скопировать скетч ниже, скомпилировать, прошить. Работает?
Blinker:
01
class
Blinker
02
{
03
public
:
04
Blinker(
int
p_delay=2);
05
void
blink();
06
private
:
07
int
m_delay_ms;
08
};
09
10
Blinker::Blinker(
int
p_delay
/*=2*/
)
11
: m_delay_ms(p_delay)
12
{
13
}
14
15
void
Blinker::blink()
16
{
17
digitalWrite(13, HIGH);
18
delay(m_delay_ms);
19
digitalWrite(13, LOW);
20
delay(m_delay_ms);
21
}
22
23
Blinker blink(1000);
24
25
void
setup
() {
26
// put your setup code here, to run once:
27
pinMode(13,OUTPUT);
28
}
29
30
void
loop
() {
31
// put your main code here, to run repeatedly:
32
blink.blink();
33
}
Громадное спасибо! )
Еще столкнулся с частичным искажением данных, если в классе один из параметров
- массив byte без указания размера.
Может так делать не рекомендуется? А если размер массива указываю сразу, искажений нет.
Или глюк?
Если массив, член класса, без указания размера, то размер его, я даже не знаю, скорей всего пустой, глюки обеспечены. Либо указывать размер при объявлении, либо создавать динамически (не рекомендую). Хотя если динамически и создавать один раз тогда вполне нормально.
Помогите пожалуйста понять, что означает 11 строка скетча?
1
: m_delay_ms(p_delay)
Почему она начинается с двух точек ":"? Что значит этот символ в данном случае? Даже не знаю, по какому запросу искать?
Я проанализировал и прокомментировал скетч! Кто разбирается, пожалуйста посмотрите, правильно ли я написал?
01
class
Blinker
// создаем класс Blinker
02
{
// описание класса
03
public
:
// публичная
04
Blinker(
int
p_delay=2);
// переменная...
05
void
blink();
// и функция
06
private
:
// приватная
07
int
m_delay_ms;
//переменная
08
};
09
10
Blinker::Blinker(
int
p_delay
/*=2*/
)
// это наверно конструктор класса Blinker ?
11
: m_delay_ms(p_delay)
// ????? а вот что это такое??? я не понял
12
{
13
}
14
15
void
Blinker::blink()
// функция объекта Blinker называется blink
16
{
17
digitalWrite(13, HIGH);
// вкл.
18
delay(m_delay_ms);
// пауза
19
digitalWrite(13, LOW);
// выкл.
20
delay(m_delay_ms);
// пауза
21
}
22
23
Blinker blink(1000);
// объект (или экземпляр) класса blink с переданным в него значением 1000
24
25
void
setup
() {
26
// put your setup code here, to run once:
27
pinMode(13,OUTPUT);
28
}
29
30
void
loop
() {
31
// put your main code here, to run repeatedly:
32
blink.blink();
// объект blink с функцией blink
10
Blinker::Blinker(
int
p_delay
/*=2*/
)
// это наверно конструктор класса Blinker ?
11
: m_delay_ms(p_delay)
// ????? а вот что это такое??? я не понял
12
{
13
}
это инициализатор полей класса. В этом месте можно присвоить начальные значения переменным класса. Можно вызвать конструктор этого же класса с другими параметрами.
Спасибо Вам за подсказку! А не могли бы Вы детельнее описать, что делают эти строчки?
Я так понял, что в 10 строке инициализируется переменная
p_delay типа int и ей присваивается значение 2, указанное в 4 строке?
1
Blinker(
int
p_delay=2);
Верно? А что происходит дальше? Я так и не понял, что происходит в строке 11
1
: m_delay_ms(p_delay)
Переменная m_delay_ms принимает значение переменной p_delay?
Это эквивалентно записи:
1
m_delay_ms = p_delay;
Верно ли я рассуждаю? Может я задаю глупые вопросы, но я ещё никогда не видел строчек на С++, начинающихся с двоеточия! Для чего там оно, так и не понял! Объясните пожалуйста, кому не сложно!
Заранее спасибо!
https://msdn.microsoft.com/ru-ru/library/s16xw1a8.aspx
Иль ты думаешь, тебе тут лекции по С++ чтить будут? Дали пинок в нужную сторону и читай, разбирайса.
Это обычная инициализация полей(свойств класса)
01
#include "stdafx.h"
02
#include <iostream>
03
using
namespace
std;
04
05
class
A {
06
public
:
07
int
i;
08
A(
int
ii) : i(ii) {
09
cout << i << endl;
10
}
11
12
};
13
14
int
main(
int
argc,
char
* argv[])
15
{
16
A a(5);
17
system(
"pause"
);
18
return
0;
19
}
есть несколько вариантов инициализации.
1
Бинарный оператор :: уточняет область видимости в которой находится имя.
2
С левой стороны должна быть указана область видимости, с правой стороны - уточняемое имя.
https://ru.stackoverflow.com/questions/475616/%D0%9E%D0%BF%D0%B5%D1%80%D...
ПС: по теме. Это говорит что функция находится в данном классе.
Пух, ты бухой? Ты вопрос читал?
Пух, ты бухой? Ты вопрос читал?
01
/**/
02
//----------------------------
03
class
Cl_AAA {
04
protected
:
05
const
byte
data;
//<-- потому что здесь стоит const
06
public
:
07
/*конструктор*/
08
Cl_AAA(
byte
d) {
09
data = d;
//<-- вот хрен такое пройдет
10
}
11
};
12
//----------------------------
13
void
setup
() {
14
}
15
16
void
loop
() {
17
18
}
И этот
01
/**/
02
//----------------------------
03
class
Cl_AAA {
04
protected
:
05
const
byte
data;
//<-- потому что здесь стоит const
06
public
:
07
/*конструктор*/
08
Cl_AAA(
byte
d):data(d) {
//<-- а вот так залетает
09
}
10
};
11
//----------------------------
12
void
setup
() {
13
}
14
15
void
loop
() {
16
17
}
А это так на закуску.
01
/**/
02
//----------------------------
03
class
Cl_AAA {
04
protected
:
05
const
byte
data;
06
public
:
07
/*конструктор*/
08
Cl_AAA(
byte
d): data(d) {
09
}
10
};
11
//-----------------------
12
class
Cl_BBB {
13
protected
:
14
const
Cl_AAA AAA;
//<-- заметьте объект в классе константный
15
public
:
16
/*конструктор*/
17
Cl_BBB(
byte
d): AAA(d) {
// и его и здесь можно инициализировать
18
}
19
};
20
//-------------------------
21
Cl_BBB BBB(
/*data*/
10);
22
//----------------------------
23
void
setup
() {
24
}
25
26
void
loop
() {
27
28
}
29
/*Скетч использует 488 байт (1%) памяти устройства. Всего доступно 30720 байт.
30
Глобальные переменные используют 10 байт (0%) динамической памяти, оставляя 2038 байт для локальных переменных. Максимум: 2048 байт.
31
*/
я дал пинок в нужную сторону и дал ссылку на почитать побольше. Имеющий глаза и моск - разбереца. Там и про const написана.
только при чём здесь область видимости aka :: ?
я дал пинок в нужную сторону и дал ссылку на почитать побольше. Имеющий глаза и моск - разбереца. Там и про const написана.
только при чём здесь область видимости aka :: ?