Vererbung von Klassen aus Library für Sonderfunktionen nicht möglich

Hallo zusammen,

Hab nach mehreren Jahren wieder mit dem Programmieren von Mikrocontrollern angefangen und mir einen Arduino Uno und Mega geholt.

Ich möchte mir gerne für das 16x2 Display Funktionen anpassen, da ich nur einzelne Werte Ein- bzw. Ausblenden möchte, quasi die NoDisplay() Funktion für einzelne Bereiche.

Ich dachte, ich vererbe einfach die LiquidCrystal Klasse und ergänze die fehlenden Funktionen. Aber wenn ich ein Objekt der neuen Klasse erzeugen will, kommt ein Fehler beim kompilieren.
Ich habe bisher nicht viel gemacht außer folgende Klasse erstellt und eine einfache Funktion ergänzt:

#ifndef new_LiquidCrystals_h
#define new_LiquidCrystal_h
#include <LiquidCrystal.h>
class new_LiquidCrystal : public LiquidCrystal
{
  private:
     bool _LettersDisabled;

  public:
  void DisableLetters()
  {
    _LettersDisabled = true;
  }
   void EnableLetters()
   {
     _LettersDisabled = false;
   }
};
#endif

Wenn ich jetzt folgendermaßen das Objekt erstelle, geht’s nicht:

new_LiquidCrystal lcd(34, 35, 36, 37, 38, 39);

Fehler: "no matching function for call to ‘new_LiquidCrystal::new_LiquidCrystal(int, int, int, int, int, int)’ "
Hab ich da irgendwas falsch verstanden mit der Vererbung?

Hi

Auch die LiquidCrystal-Klasse hat keinen Member, Der So heißt - aber viel Mehr kann ich Dir Dazu auch nicht sagen.

MfG

Hallo, ja das stimmt, allerdings beinhaltet die LiquidCrystal folgendes:
LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);

Dass der Kompiler 6 int interpretiert liegt wohl daran, dass er nicht weiß, dass ich die Pins nicht deklariert habe. Ergänze ich jeweils ein (uint_8), dann stehts entsprechend auch im ausgegebenen Fehler. Das ist also nicht das Problem.
Wenn ich aus der vererbten Klasse das Objekt erzeuge, kommt kein Fehler.

Konstruktoren werden nicht vererbt!

https://en.cppreference.com/w/cpp/language/using_declaration
https://en.cppreference.com/w/cpp/language/initializer_list

Entweder mit "using" oder du rufst den Basisklassen-Konstruktor in der Initialisierungsliste des Konstruktors deiner Klasse auf

Danke, das war das Problem. Konstruktor mit Verweis auf Basiskonstruktor ergänzt und schon klappts.

Hi

Gibt's für die Dummen unter uns Das auch als 'So klappt Das'-Beispiel?

MfG

also bei mir hat das so wie von serenifly vorgeschlagen mit using LiquidCrystal::LiquidCrystal; funktioniert.

die Variante mit dem Konstruktor sowieso. Aus einem anderen Beispiel:

LiquidCrystal_I2C_ST7070::LiquidCrystal_I2C_ST7070(uint8_t lcd_Addr, uint8_t lcd_cols, uint8_t lcd_rows) :
  LiquidCrystal_I2C(lcd_Addr, lcd_cols, lcd_rows) {}

Ok, Das war zu einfach - etwas mehr 'Magie' hätte ich schon erwartet :slight_smile:

postmaster-ino:
Ok, Das war zu einfach - etwas mehr 'Magie' hätte ich schon erwartet :slight_smile:

Darf ich raten?
Diese Scheu vor der "Magie" verhindert die allumfassende Beschäftigung mit dem Thema.
(zumindest ist das recht verbreitet)

Hi

Das wohl auch - sonst ist's im Allgemeinen das Unvermögen, 'den Arsch hoch zu bekommen'.
Habe die letzten Tage viel mehr an der Gartenbeleuchtung des Bekannten rumgeschraubt, als eigene Projekte weiter zu verfolgen.
(wird jetzt aber genau so weiter gehen ... Morgen ist 'Abgabetermin')

MfG

Hätte auch meinen Code noch posten können für die Allgemeinheit sorry!
Aber im Endeffekt wie oben bereits erwähnt:

new_LiquidCrystal(uint8_t rs_in, uint8_t enable_in, uint8_t d0_in, uint8_t d1_in, uint8_t d2_in, uint8_t d3_in) : LiquidCrystal(rs_in, enable_in, d0_in, d1_in, d2_in, d3_in) {}

Was allerdings auch ganz wichtig war und mir noch nicht bekannt:
Aufruf mit runden Klammern nur als globale Variable möglich. Ansonsten wird es nicht als Konstruktor erkannt. Innerhalb von Klasse oder Funktion muss eine geschweifte Klammer verwendet werden, die wohl immer funktioniert.