Probléme de classe utilisé par un autre classe

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 :wink:

Bonjour,

Tu ne peux pas instancier une class avec des paramètres dans une définition de class

    Capteur h(int Pin, int Delai, bool invers);
    Capteur b(int Pin, int Delai, bool invers);

La solution que je vois:

  • Tu ajoutes un constructeur sans paramètre dans Capteur
  • Tu inclues les membres h et b sans paramètre dans Capteurs
  • Tu ajoutes une fonction set(int Pin, int Delai, bool invers) dans la class Capteur
  • Tu appelles h.set(...) et b.set(...) dans le constructeur de Capteurs

Merci je vais regarder ca, tu aurais des exemples stp :wink:

Non, je n'ai pas d'exemple en tête, mais ça me parait simple à faire.
Si tu as un problème, n'hésites pas à poser des questions.

merci ca fonctionne, pas bien ais ca fonctionne :wink:

Bonsoir,

Il y a moyen de faire ce que vous voulez, mais la syntaxe du constructeur de la classe de plus haut niveau n'est pas simple.
Dans votre cas, cela donnerait quelque chose comme :

Dans la déclaration de la classe Capteurs, section private :

    Capteur h, b;

Et dans le constructeur de la dite classe :

Capteurs::Capteurs(int _PinH, int _PinB, char _type, int _delai, bool _invers) :
            h(PinH, delai, invers),
            b(PinB, delai, invers)
  {
  setPin(_PinH, _PinB);
  setType(_type);
  setDelai(_delai);
  setInvers(_invers);
  etas = 'm';
  }

Cela instancie tout en même temps les 2 capteurs h et b dans l'instance de la classe Capteurs.
Bonne bidouille,

MicroQuettas

Merci c'est réglé :wink:

Ancien de la première heure sur Flash, et sur des forums en rapport, je n'avais jamais étais aussi bien répondus et passait plus de temps a répondre après avoir trouvé la solution solo, donc merci beaucoup :wink: