PID Klasse einer eigenen Klasse vererben

Hallo zusammen,

ich möchte meiner "PIDcontrolClass" die Arduino Klasse PID_v1.h vererben.

#include "PID_v1.h"


class PIDcontrolClass :  public PID		/// alle Eigenschaften der PID Klasse stehen zur Verfügung
{
 protected:
	 pid_t* pid;


 public:
	void init(pid_t*);
};

extern PIDcontrolClass pidControl;

leider kommt diese Fehlermeldung.

"PIDcontrol.h:In constructor 'PIDcontrolClass::PIDcontrolClass()'
PIDcontrol.h:24:7: error: no matching function for call to 'PID::PID()'
class PIDcontrolClass *:public PID :^
"

Kann bitte jemand weiterhelfen?

Ansonsten Allen eine schöne Weihnacht und alles Gute für die kommenden Jahre.

Willi

Da fehlt wahrscheinlich die Deklaration eines Default Konstruktors der den Konstruktor der Basis Klasse aufruft. Es ist kein Konstruktor definiert, also wird versucht den Default Konstuktor der Basis Klasse aufzurufen und der existiert nicht.

Das wird aber so generell nichts. Das hier stimmt nämlich nicht:
"alle Eigenschaften der PID Klasse stehen zur Verfügung"

Die internen Variablen von PID sind private. Auch mit dem ": public PID" werden die in deiner Klasse nicht sichtbar.

Und protected bringt in einer abgleitenden Klasse nichts. Protected ist ein Attribut für Variablen in Basis Klassen. Diese sind dann in der abgleitenden Klasse sichtbar aber nach Außen nicht.

Du kannst natürlich die PID Klasse editieren und das von private auf protected ändern. Allerdings ist die PID Klasse auch so simpel, dass du die relevanten Teile herauskopieren und dir eine komplett eigenständige Klasse schreiben könntest.

protected: pid_t* pid;

Sieht so aus, als ob deine PIDControlclass ein pid_t enthalten soll. Da brauchst du evtl. gar keine Vererbung, sondern es reicht, wenn dein PIDControlclass Constructor ein pid_t Unterelement erzeugt und das über die member-Variable pid zur Verfügung stellt ???

In jedem Fall fehlt aber, wie Serenifly schon richtig bemerkt hat, ein passender constructor.

Ob ein pid_t* ein Zeiger auf eine Instanz der PID Klasse sein soll war mir nicht klar. Das ist in dem Code nirgends definiert. Wenn ja, hat das da aber nichts verloren.

So sollte es mit Vererbung gehen:

Header:

#ifndef CUSTOM_PID_H
#define CUSTOM_PID_H

//ich habe die PID Dateien umbenannt da mich das _v1 gestört hat!
#include <PID.h>

class CustomPID : public PID
{
public:
  CustomPID(double*, double*, double*, double, double, double);
  void testMethod();
private:
};

#endif

Implementierung/.cpp:

#include "CustomPID.h"

//hier ruft der Konstruktor der abgleitenden Klasse den Konstruktor der Basis-Klasse auf und reicht die Parameter weiter

CustomPID::CustomPID(double* input, double* output, double* setpoint, double kP, double kI, double kD) 
 : PID(input, output, setpoint, kP, kI, kD, DIRECT)
{
}

void CustomPID::testMethod()
{
   PID::dispKd = 2.0;

   //das hier geht nur wenn man die PID Klasse editiert und die Member von private auf protected ändert!
   //ansonsten kommt hier ein Fehler dass die Variable private ist   
}

Test:

//dass man hier die Basis-Klasse inkludieren muss ist wohl eine Arduino Eigenheit
#include <PID.h>
#include "CustomPID.h"

double input, output, setpoint;
CustomPID pid(&input, &output, &setpoint, 1.0, 0.0, 0.0);

void setup()
{
}

void loop()
{
  pid.testMethod();
  pid.Compute();
}

Vielen Dank für die Antworten. Ich habe natürlich auch weiter nach einer Lösung gesucht, und ich denke, wenn ich das hier so lese auf dem richtigen Weg. Ich habe eine Klasse für meine 3(4) PID-Regler gemacht, und diese dann an meine "LageKontrollKlasse" vererbt.
Werde eure Tipps mal mit meiner Lösung vergleichen. So kann ich sehen, ob ich wirklich auf dem richtigen Weg bin.

Gruß Willi

Das ist eigentlich nichts für Vererbung. Wenn ich das richtig verstehe willst du eine Aggregation oder Komposition ("hat-ein"/"has-a") und nicht ("ist-ein"/"is-a"):

http://openbook.galileo-press.de/oo/oo_04_strukturvonooprogrammen_002.htm#Rxxob04strukturvonooprogrammen002040015221f03719e
http://jag2000.de/c++/index.php?id=files/kapF&pid=kap2100

Wenn du eine Klasse möchtest die 4 PID Regler kontrolliert, dann erstellst du in der Klasse 4 Instanzen der PID Klasse. Aber deine Klasse muss da doch nicht die Interna der PID Klasse kennen.

Dass ist das was michael_x schon erwähnt hat.