Создание объекта одного класса внутри другого.
- Войдите на сайт для отправки комментариев
Ср, 28/06/2017 - 00:08
Всем привет.
Помогите пожалуйста: написал программу. работает. решил оформить ее как класс. все ок, работает.
Есть одно но - у меня внутри класса используется объект (LiquidCrystal_I2C lcd(0x3F,16,2);) который был инициализирован вне класса. Это как-то нехорошо. Я хочу его внести внутрь класса и инициализировать его ... точно не понимаю где, наверное в конструкторе моего класса. Попробовал десятка два вариантов - компилятор выдает ошибку. Подскажите как мне объект lcd создавать внутри класса OneLevelMenu .
Полный код:
//======================================================================
// Определяю класс "OneLevelMenu".
// Он будет отвечать отвечать за отображение меню,
// обрабатывать изменения меню, запускат процедуры по указателям.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2); // ЭТО ПОКА НУЖНО ВКЛЮЧАТЬ В ФАЙЛ ГДЕ БУДЕМ ИСПОЛЬЗОВАТЬ КЛАСС
class OneLevelMenu {
public:
OneLevelMenu(int startPosition);
int curentMenuPosition =1;
unsigned long ptrFunction1 =0; // здесь будет указатель на обработчик клика в первом пункте меню.
unsigned long ptrFunction2 =0;
unsigned long ptrFunction3 =0;
#define MAXMENUPOINT 3 // Определяет сколько будет пунктов в меню. Для увеличения нужно править константы и процедуры.
#define HiStr1 " Hi,it's menu."
#define HiStr2 "Use Up,Down,Ok."
#define MENUPOIN1 "Run read IR Sens" // То что будем вывдить на экран при выборе пункта №1
#define MENUPOIN2 "I can light p13" //--пункта №2 и т.д.
#define MENUPOIN3 "I can off p13"
#define UP 1
#define DOWN 2
#define ENTER 3
#define EXIT 4
void setPosition (int pos);
void StartMenu ();
void Touch(unsigned long code); // Любое обращение к меню. Принимает код оброщения и обробатывет его.
void drawMenu (int point); // выводит нужную строчку меню.
};
OneLevelMenu::OneLevelMenu(int startPosition) { // Здесь мы полностью запуститм LCD и напечатаем приветствие. И опередлим с какой позиции стартует меню.
curentMenuPosition =startPosition;
}
void OneLevelMenu::StartMenu () {
lcd.init ();
lcd.backlight ();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(HiStr1);
lcd.setCursor(0,1);
lcd.print(HiStr2);
}
void OneLevelMenu::drawMenu (int point)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("Menu. #Ok #Exit");
lcd.setCursor(0,1);
switch (point) {
case 1:
lcd.print (MENUPOIN1);
break;
case 2:
lcd.print (MENUPOIN2);
break;
case 3:
lcd.print (MENUPOIN3);
break;
}
}
void OneLevelMenu::Touch(unsigned long code)
{
switch (code) {
case UP:
if (curentMenuPosition == MAXMENUPOINT) {
curentMenuPosition =1;
break;
}
else {
curentMenuPosition++;
}
break;
case DOWN:
if (curentMenuPosition == 1) {
curentMenuPosition =3;
break;
}
else {
curentMenuPosition--;
}
break;
case ENTER:
break;
case EXIT:
break;
}
drawMenu(curentMenuPosition);
};
//=====================================
OneLevelMenu MyMenu(1);
//---------------------------------------------------------
void setup() {
// put your setup code here, to run once:
MyMenu.StartMenu();
}
void loop() {
// put your main code here, to run repeatedly:
for (int a=1;a<=6;a++) {
MyMenu.Touch (2);
delay (700);
}
}
/*
void showDebug (unsigned long x,int mark,int del) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("Debuging");
lcd.setCursor(10,0);
lcd.print(millis());
lcd.setCursor(0,1);
lcd.print (x,HEX);
lcd.setCursor(8,1);
lcd.print (mark);
delay (del);
}*/
Определитесь . Где вам нужен LiquidCrystal_I2C lcd(0x3F,16,2)
#include <Wire.h> #include <LiquidCrystal_I2C.h> class Cl_AAA { public: LiquidCrystal_I2C *lcd; Cl_AAA() { lcd = new LiquidCrystal_I2C(0x3F, 16, 2); } } AAA; void setup() { } void loop() { }пс http://purecodecpp.com/archives/2286
Все получилось. Большое спасибо!
А подскажите, если lcd сделать static, и наследоваться от этого класса. То при каждом объявлении дочернего класса будет создаваться новый экземпляр LiquidCrystal_I2C ?