Передача в класс ссылки на другой класс (синтаксис с++)

Тема в разделе "Микроконтроллеры AVR", создана пользователем AlexVS, 6 июл 2018.

  1. AlexVS

    AlexVS Гик

    Для записи логов на SD Card, написал свой класс Logger, который использует методы библиотеки SD.h.
    Код (C++):
    #ifndef SAVELOG_h
    #define SAVELOG_h
    #include <SD.h>

    #define bufflen   2048  //объем буфера записи (кэша)

    class LOGGER {
      private :
        int  cashpoint = 0;
        char cashbuffer[bufflen]={0}; //буфер (кэш)
        char buff[256]={0};
        String TwoDigit(int value);
        boolean CheckDelFile(const String &FileName);
        String GetFileName();
        void SaveData(const String s,boolean prnln);
      public :
         LOGGER();
         boolean Init(bool toSD);
         int GetCashPoint();
         void SaveCash2SD(bool prevdate = false,bool fullcash = false);
         void println(const String &s);
         void println(int);
         void println(unsigned int);
         void println(unsigned long);
         void println(float);
         void println(double);
         void println(char);
         void println(unsigned char);
         void println(const char[]);
     
         void print(const char[]);
         void print(char);
         void print(unsigned char);
         void print(const String &s);
         void print(int);
         void print(unsigned int);
         void print(unsigned long);
         void print(long);
         void print(float);
         void print(double);
         void DeleteOldFile();
         boolean fDebug;
    };
    #endif
    В основном файле проекта (Station.ino)
    Код (C++):

    // подключаем Logger
    #include "savelog.h"

    //Инициализируем Logger
    LOGGER Log;
     
    Так же в проекте присутствуют объекты других классов, из них тоже пишется лог-файл.
    Как правильно передать в другой объект ссылку, на уже созданный объект Log, что бы Log, оставался единственным экземпляром?
    Я воспользовался объявлением в h-файлах
    extern LOGGER Log;
    Но скорее всего есть более корректный метод.
     
  2. Mitrandir

    Mitrandir Гуру

    Синглетон?
     
  3. Mitrandir

    Mitrandir Гуру

    Я бы перенес extern Logger...
    В фаил реализации методов логгера
     
  4. AlexVS

    AlexVS Гик

    Синглетон.

    Видимо да, но с ходу (из инета) не пойму как реализуется :(
     
  5. Mitrandir

    Mitrandir Гуру

    В классе обьявляется статический член типа Logger* с модификатором прайвет. Так же есть статический публичный метод getLogger()

    Код (C++):
    Logger* getLogger() {
      if (Logger::singleLogger == NULL) {
           Logger::singleLogger = new Logger();
    }
      return Logger::singleLogger;
    }
     
    AlexVS нравится это.
  6. Mitrandir

    Mitrandir Гуру

    Если не ошибаюсь, года 4 как перешел на джаву, мог подзабыть тонкости с++
     
  7. AlexVS

    AlexVS Гик

    Файл реализации методов логгера - это ведь savelog.cpp/
    Почему туда надо перенести?
     
  8. AlexVS

    AlexVS Гик

    Примерно понял.
     
  9. Mitrandir

    Mitrandir Гуру

    Просто для красоты, чтоб логгер был атомарным. Зазотел в другой проект перенести, скопировал эти два файла и не надо париться с объявлением логгер, сам объявится
     
  10. AlexVS

    AlexVS Гик

    Мне почему то казалось, что это реализуется как то так
    Код (C++):
    SdBaseFile(const char* path, uint8_t oflag) : FatFile(path, oflag) {}
    Просто отвлеченный кусок кода.
    Видимо я ошибся :(