Скрытие использования класса внутри библиотеки

0

Я создаю простую библиотеку для Arduino, цель которой - обернуть и скрыть другой класс внутри него. Я хотел бы иметь возможность полностью скрыть базовый класс от конечного пользователя.

Я несколько упростил этот пример, чтобы все было ясно, но та же проблема существует.

Класс, который я пытаюсь обернуть, это библиотека Wire, которая называется TwoWire.

Файл заголовка библиотеки обертки:

#ifndef __DERIVEDONEWIRE2_H__
#define __DERIVEDONEWIRE2_H__

#include <Wire.h>

class DerivedWire
{
private:
    TwoWire wire;

public:
    DerivedWire();
};
#endif

Файл CPP:

#include "DerivedWire.h"

DerivedWire::DerivedWire()
{
}

И эскиз Arduino, который использует его:

#include <DerivedWire.h>

DerivedWire derivedWire;

void setup()
{
}

void loop()
{
}

Это не скомпилируется:

/Users/andrew/Documents/Arduino/libraries/DerivedWire/DerivedWire.h:9: ошибка: "TwoWire" не называет тип

В том числе Wire.h в верхней части основного эскиза позволяет это скомпилировать:

#include <DerivedWire.h>
#include <Wire.h>

DerivedWire derivedWire;

void setup()
{
}

void loop()
{
}

Однако я хотел бы полностью скрыться от пользователя библиотеки DerivedWire, которая вообще используется для библиотеки Wire/TwoWire.

Я попытался изменить линию "TwoWire wire"; к "проводке TwoWire"; - теперь я получаю следующую ошибку:

/Users/andrew/Documents/Arduino/libraries/DerivedWire/DerivedWire.h:9: ошибка: ISO C++ запрещает объявление "TwoWire" без типа /Users/andrew/Documents/Arduino/libraries/DerivedWire/DerivedWire.h: 9: ошибка: ожидается ';' перед маркером '*'

Я пробовал несколько других вещей, но мне кажется, что мне нужно включить Wire.h на верхнем уровне.

Как это исправить?

Теги:
class
arduino

2 ответа

1

Экземпляр Wire создается на последней строке в lib. https://github.com/lstoll/arduino-libraries/blob/master/Wire/Wire.cpp. Вы НЕ должны иметь несколько экземпляров TwoWire, и нет причин скрывать их, но если вы действительно хотите скрыть вам нужно удалить эту строку. Метод сборки arduino требует, чтобы lib был включен из основного эскиза, поэтому вы не можете скрыть эту часть без значительных изменений.

Если вам действительно нужно скрыть этот экземпляр Wire, вы можете скопировать источник Wire lib в свою собственную библиотеку и удалить эту последнюю строку.

  • 0
    Я немного смущен сейчас. 1. Конструктор для TwoWire ничего не делает, поэтому вполне возможно создать свой собственный экземпляр вне того, который был создан внизу заголовка. Я понимаю, что может быть только один экземпляр, но он не защищен и, похоже, не вызывает этой проблемы. 2. Какой аспект среды сборки вызывает это? Я могу включить HardwareSerial.h и скрыть это - почему не другие заголовки? Разве это разрешено только в / cores / Arduino?
  • 0
    @Cybergibbons Мне не известны подробности системы сборки Arduino, но упоминается несколько мест, что, если библиотека зависит от другой библиотеки, они оба должны быть явно включены в сам эскиз, чтобы они были правильно связаны. Я отредактировал свой ответ, чтобы включить решение.
0

Ознакомьтесь с "идиомой pimpl", здесь ссылка для начала работы: http://en.wikipedia.org/wiki/Opaque_pointer

Идиома Pimpl - это способ C++ скрыть реализацию класса и все функции, которые вы не хотите видеть.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню