2014-08-28 1 views
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: error: invalid type in declaration before ',' token class CUSB : public HardwareSerial(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR){ ^ D:\Arduino\sketchbook\libraries\USB/USB.h:36:50: error: 'UBRRL' declared as reference but not initialized D:\Arduino\sketchbook\libraries\USB/USB.h:36:53: error: 'UCSRA' declared as reference but not initialized class CUSB : public HardwareSerial(&UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR){

ответ

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 или есть более простой способ? – 2014-08-28 14:14:35

+0

Если вы имеете в виду вызов реализации базы переопределенного виртуального метода, вы можете сделать это: 'class CUSB: public HardwareSerial {virtual void foo() override {HardwareSerial :: foo(); }}; '. Вам нужно будет уточнить, имеете ли вы что-то еще. – Zoomulator

Смежные вопросы