Наследование класса со ссылками в конструкторе

0

Я использую Arduino, и я пытаюсь создать пользовательский Serial Class, который отфильтровывает специальные данные. Поэтому я хочу наследовать HardwareSerial для доступа к его защищенному буферу RX.

Я могу представить себе три решения: наследовать класс для доступа к этому буферу

Создайте экземпляр этого класса в моем классе, но затем я не знаю, как получить доступ к защищенному буферу

Скопируйте весь класс или просто наследуйте несколько функций для изменения всех функций. может быть лучшим решением.

Что работает:

.h:
extern HardwareSerial Serialk;
.cpp:
HardwareSerial Serialk(&UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UCSR0C, &UDR0);
Serialk._tx_udr_empty_irq();

Но я не могу наследовать класс следующим образом:

class CUSB : public HardwareSerial (&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR){
[..] }

Это вызывает такие ошибки:

D:\Arduino\sketchbook\libraries\USB/USB.h: 36: 50: ошибка: недопустимый тип объявления до ',' класс токена CUSB: public HardwareSerial (& UBRRH, & UBRRL, & UCSRA, & UCSRB, & UCSRC и UDR) {^ D:\Arduino\sketchbook\libraries\USB/USB.h: 36: 50: ошибка: 'UBRRL' объявлен как ссылка, но не инициализирован D:\Arduino\sketchbook\libraries\USB/USB.h: 36: 53: ошибка: 'UCSRA' объявлен как ссылочный, но не инициализированный класс CUSB: public HardwareSerial (& UBRRH, & UBRRL, & UCSRA, & UCSRB, & UCSRC и UDR) {

Теги:
inheritance

1 ответ

0
Лучший ответ

Вы не должны пытаться экземпляр объекта HardwareSerial, где вы объявляете его как базовый класс. Это должно быть сделано в конструкторе вашего собственного объекта.

class CUSB : public HardwareSerial {

    // Constructor method
    CUSB() : HardWareserial( /* your variables you wish to pass on to base class. */ ) {
        /* Initialize your own class. */
    }

    [..]
};
  • 0
    Высокий (работа)! Есть ли способ перезаписать виртуальные функции, но при этом использовать его как другой экземпляр? Так что я могу сделать USB.Serial.print () ;? Нужно ли создавать другой класс, такой как CUSBSerial, и создавать экземпляр в моем классе CUSB, или есть более простой способ?
  • 0
    Если вы имеете в виду вызов реализации базового переопределенного виртуального метода, вы можете сделать это: class CUSB : public HardwareSerial { virtual void foo() override { HardwareSerial::foo(); } }; , Вам придется уточнить, если вы имели в виду что-то еще.

Ещё вопросы

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