Создание объекта одного класса внутри другого.

kurakste
Offline
Зарегистрирован: 27.06.2017

Всем привет. 

Помогите пожалуйста: написал программу. работает. решил оформить ее как класс. все ок, работает.

Есть одно но - у меня внутри класса используется объект (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);
}*/

 

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

Определитесь . Где вам нужен 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

kurakste
Offline
Зарегистрирован: 27.06.2017

Все получилось. Большое спасибо!

 

melnik88
Offline
Зарегистрирован: 27.02.2022

А подскажите, если lcd сделать static, и наследоваться от этого класса. То при каждом объявлении дочернего класса будет создаваться новый экземпляр LiquidCrystal_I2C ?