Bonjour a vous, j'ai un problème sur les classe, je commence en c++ après d'autres langages et un détaille doit m'échapper.
J'ai un classe 'Capteur.h' qui gère un capteur de fin de course et je veux l'utiliser dans une classe 'Capteurs.h' qui elle vas contrôler les infos de 2 cdfc pour en extraire que l'utile :
Capteurs.h :
#ifndef CAPTEURS_H
#define CAPTEURS_H
#include "Capteur.h"
using namespace std;
class Capteurs {
public:
Capteurs(int _PinH, int _PinB, char _type, int _delai, bool _invers);
char getEtas();//renvoi si changement la vaeur de etat et si pas de changement, 0
void setType(char _type);
private:
Capteur h(int Pin, int Delai, bool invers);
Capteur b(int Pin, int Delai, bool invers);
char etas, etasMem;//z au max, a au min, m au milieu, o en dehors
int PinH, PinB, delai;
bool invers = false;
bool sensMontant = true; //true montant, false descendant
void setPin(int _PinH, int _PinB);
void setDelai(int _delai);
void setInvers(bool _invers);
void changeEtas(char v);
char controle();
char type;//d pour en segment de droite, r pour rotation permanente
};
#endif
Capteurs.cpp :
#include "Capteurs.h"
#include "Capteur.h"
Capteurs::Capteurs(int _PinH, int _PinB, char _type, int _delai, bool _invers) {
setPin(_PinH, _PinB);
setType(_type);
setDelai(_delai);
setInvers(_invers);
etas = 'm';
Capteur h(PinH, delai, invers);
Capteur b(PinB, delai, invers);
}
void Capteurs::setPin(int _PinH, int _PinB) {
PinH = _PinH;
PinB = _PinB;
}
void Capteurs::setDelai(int _delai) {
this->delai = _delai;
}
void Capteurs::setInvers(bool _invers) {
this->invers = _invers;
}
void Capteurs::setType(char typ) {
type = typ;
}
char Capteurs::getEtas() {
char ret = '0';
controle();
if (etas != etasMem) {
ret = etas;
}
return ret;
}
void Capteurs::changeEtas(char v) {
etasMem = etas;
etas = v;
}
char Capteurs::controle() {
bool changeH = h.event();
bool changeB = b.event();
bool etasH = h.getMem();
bool etasB = b.getMem();
if (changeH == true || changeB == true) {
if (type == 'r') {
if (etasH == 1 && etasB == 1) {
changeEtas('z');
} else {
changeEtas('m');
}
} else {
changeEtas('m');
if (etasB == 1) {
changeEtas('z');
}
if (etasH == 1) {
changeEtas('a');
}
}
} else {
changeEtas('m');
}
return etas;
}
pour info la classe Capteur.h qui fonctionne bien sur un code ino
Capteur.h :
#ifndef CAPTEUR_H
#define CAPTEUR_H
using namespace std;
class Capteur {
public:
Capteur(int _Pin, int _delai, bool _invers);
int getPin();
bool getEtat();
bool getMem();
bool event();
private:
int memLong;
int i;
bool invers;
int delai;
int Pin;
bool eventNeo=true;
bool etat;
bool mem[4];
void ajoutMem(bool _etat);
void setPin(int _Pin);
void setInvers(bool _invers);
void setDelai(int _delai);
void setMem();
void setMemLong(int _memLong);
};
#endif
Capteur.cpp :
#include <Arduino.h>
#include "Capteur.h"
Capteur::Capteur(int _Pin, int _delai, bool _invers) {
eventNeo=true;
etat=false;
memLong = 4;
setPin(_Pin);
setInvers(_invers);
setDelai(_delai);
setMem();
pinMode(Pin, INPUT);
}
int Capteur::getPin() {
return Pin;
}
bool Capteur::getEtat() {
return etat;
}
bool Capteur::getMem() {
return mem[(memLong - 1)];
}
void Capteur::setPin(int _Pin) {
this->Pin = _Pin;
}
void Capteur::setDelai(int _delai) {
this->delai = _delai;
}
void Capteur::setMem() {
this->mem[memLong];
}
void Capteur::setMemLong(int _memLong) {
this->memLong = _memLong;
}
void Capteur::setInvers(bool _invers) {
this->invers = _invers;
}
void Capteur::ajoutMem(bool _etat)
{
int o;
for (o = 0; o < memLong; o++) {
mem[o] = mem[o + 1];
}
mem[memLong] = _etat;
}
bool Capteur::event() {
bool reading = digitalRead(Pin);
if(invers){reading=!reading;}
long t0;
bool ret = false;
if ((reading != etat) && eventNeo==true) {
t0 = millis();
eventNeo=false;
}
if (((millis() - t0) > delai) && eventNeo==false) {
if (reading != etat) {
if(reading){ret = true;}
etat = reading;
//ajoutMem(etat);
}
eventNeo=true;
}
return ret;
}
Mon .ino :
#include "capteurs.h"
const int pinB = D4;
const int pinH = D3;
int delta=50;
Capteurs cfc(pinH, pinB,'r', delta, true);
bool cfcTest;
void setup() {
Serial.begin(115200);
while (!Serial) ;
Serial.println("debut ");
}
void loop() {
delay(delta*1.5);
cfcTest=cfc.getEtas();
if(cfcTest){Serial.println("top");}
}
le resultat :
Capteurs.cpp: In member function 'char Capteurs::controle()':
Capteurs.cpp:39:19: error: '((Capteurs*)this)->Capteurs::h' does not have class type
bool changeH = h.event();
^
Capteurs.cpp:40:19: error: '((Capteurs*)this)->Capteurs::b' does not have class type
bool changeB = b.event();
^
Capteurs.cpp:41:17: error: '((Capteurs*)this)->Capteurs::h' does not have class type
bool etasH = h.getMem();
^
Capteurs.cpp:42:17: error: '((Capteurs*)this)->Capteurs::b' does not have class type
bool etasB = b.getMem();
^
exit status 1
'((Capteurs*)this)->Capteurs::h' does not have class type
Merci pour votre aide