сделать библиотеку наследником Stream

doleynikov
Offline
Зарегистрирован: 30.01.2015

Добрый день. Делаю библиотечку под свою клавиатуру. Под это дело передалал PS2Keyboar

Работает, можно из программы делать такое:

#include "matrixKB.h"
matrixKB keyboard;
void setup() {
  delay(1000);
  keyboard.begin();
  Serial.begin(9600);
  Serial.println("Keyboard Test:");
}
void loop() {
  if (keyboard.available()) {
    // read the next key
    char c = keyboard.read();
    // otherwise, just print all normal characters
    Serial.print(c);
  }
}

внутри она на прерываниях по таймеру и сканировании портов. Но вот задался вопросом, можно ли этот класс matrixKB отнаследовать от Stream. Просто "в нагляк" указать :public Stream в определении класса - не получается.

ругается:

Simple_Test:31: error: cannot declare variable 'keyboard' to be of abstract type 'matrixKB'
 matrixKB keyboard;
          ^
In file included from /home/KB_test/Simple_Test/Simple_Test.ino:28:0:
/home/MySketchbook/build/sketch/matrixKB.h:149:7: note:   because the following virtual functions are pure within 'matrixKB':
 class matrixKB : public Stream
       ^
In file included from /home/.arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino/Stream.h:26:0,
                 from /home/.arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino/HardwareSerial.h:29,
                 from /home/.arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino/Arduino.h:232,
                 from /home/MySketchbook/build/sketch/Simple_Test.ino.cpp:1:
/home/.arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino/Print.h:48:20: note: 	virtual size_t Print::write(uint8_t)
     virtual size_t write(uint8_t) = 0;
                    ^
In file included from /home/.arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino/HardwareSerial.h:29:0,
                 from /home/.arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino/Arduino.h:232,
                 from /home/MySketchbook/build/sketch/Simple_Test.ino.cpp:1:
/home/.arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino/Stream.h:61:17: note: 	virtual int Stream::peek()
     virtual int peek() = 0;
                 ^
/home/.arduino15/packages/arduino/hardware/avr/1.6.17/cores/arduino/Stream.h:62:18: note: 	virtual void Stream::flush()
     virtual void flush() = 0;
                  ^
exit status 1
cannot declare variable 'keyboard' to be of abstract type 'matrixKB'


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

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да. Мало обьвить свой класс наследником, надо обязательно переопределить и реализовать те виртуальные функции в родительском классе, которые объявлены абстрактными. 

Абстрактные функции в С обьявляются например так: 

virtual void flush() = 0;  

в базовом классе.  В классе наследнике обязательно должна быть ее реализация

doleynikov
Offline
Зарегистрирован: 30.01.2015

Спасибо. Вроде бы получилось. Буду проверять.