Создание объекта одного класса внутри другого.
- Войдите на сайт для отправки комментариев
Ср, 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)
пс http://purecodecpp.com/archives/2286
Все получилось. Большое спасибо!
А подскажите, если lcd сделать static, и наследоваться от этого класса. То при каждом объявлении дочернего класса будет создаваться новый экземпляр LiquidCrystal_I2C ?