Помогите с синтаксисом

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 19 сен 2016.

  1. AlexVS

    AlexVS Гик

    Есть необходимость (ну или просто желание) сделать свою библиотеку на основе какой либо существующей.
    Возьмем, например, всеми любимый модуль nRF24.
    За основу берем библиотеки RF24.h и RF24Network.h
    Создаю тестовый проект, добавляю в проект новые файлы nrf.h и nrf.cpp, добавляю туда #include <RF24.h>, #include <RF24Network.h>
    Конструктор класса RF24 требует в качестве параметров _cepin и _cspin.
    А конструктор класса RF24Network требует ссылку на созданный объект RF24.
    Далее сам вопрос собственно:
    Как мне в коде своей библиотки описать переменные (объекты) для RF24 и RF24Network, если _cepin и _cspin
    я смогу передать только в конструктор своей библиотеки или даже в метод begin библиотеки?

    Я конечно могу в библиотеки RF24.h и RF24Network.h добавить новый конструктор без параметров, после чего добавить туда соответствующие методы инициализации с передачей нужных параметров, но хотелось бы обойтись без переделки стандартных библиотек.
     
  2. DIYMan

    DIYMan Guest

    Передать их из конструктора своего класса в конструктор базового:
    Код (C++):
    class MyClass : public RF24
    {
    public:
       MyClass(byte cepin, byte cspin)  : RF24(cepin, cspin)
      {
      }
    };
     
    AlexVS нравится это.
  3. AlexU

    AlexU Гуру

    Если использовать не наследование, а композицию, то примерно так:
    Код (C++):
    class MyLibrary {
    public:
        MyLibrary(uint8_t _cepin, uint8_t _cspin);
        ~MyLibrary();

    private:
        RF24 rf24;
    };
    Код (C++):
    MyLibrary::MyLibrary(uint8_t _cepin, uint8_t _cspin) : rf24(_cepin, _cspin) {
    }

    MyLibrary::~MyLibrary() {
    }
     
    AlexVS нравится это.
  4. AlexVS

    AlexVS Гик

    А для RF24Network, которая объявляется как
    Код (C++):
    RF24 radio(_ce, _csn);
    RF24Network network(radio);
    Ведь я хочу в своей библиотеке объединить и ту и другую.
     
  5. AlexU

    AlexU Гуру

    Композиция:
    Код (C++):
    class MyLibrary {
    public:
        MyLibrary(uint8_t _cepin, uint8_t _cspin);
        ~MyLibrary();

    private:
        RF24 rf24;
        RF24Network rf24Network;
    };
    Код (C++):
    MyLibrary::MyLibrary(uint8_t _cepin, uint8_t _cspin)
                : rf24(_cepin, _cspin), rf24Network(rf24)
    {
    }

    MyLibrary::~MyLibrary()
    {
    }
     
    AlexVS нравится это.
  6. AlexVS

    AlexVS Гик

    Спасибо!
    Чем больше практикуюсь в Си(++), тем интереснее :)
     
  7. AlexVS

    AlexVS Гик

    А насколько актуален деструктор в контексте Ардуино? Ведь тут создаем объект, который живет, пока не ребутнемся.
     
  8. AlexU

    AlexU Гуру

    Вопрос скорее холиварный. По моему личному мнению в классах для Arduino на базе AVR деструктор скорее не нужен. Но есть привычка... Да и мастер создания классов в Eclipse сразу генерирует заготовки для конструктора и деструктора.
     
  9. AlexVS

    AlexVS Гик

    Все понял, спасибо за разъяснение.