objet entre plusieurs h

Bonjour, pour comprendre ma question, je vais vous expliquer comment j'ai monter le programme que je suis en train de faire.

Je fabrique un robot aspirateur.
J'ai donc un fichier main.ini et j'inclue plusieurs ficher h et cpp.

Voilà la structure :
main.ino
-- ultrason.h
-- ultrason.cpp
-- moteur.h
-- moteur.cpp

Donc j'ai créé une class ultrason et une class moteur.

Je créé mes objets dans le fichier main en global : avant mon setup()

en gros je souhaite utiliser une fonction qui est défini dans la class ultrason
par une fonction qui est de la class moteur.

sauf que si j'utilise l'objet défini dans le main.ino tel quel :

capteurUltraSon *US = new capteurUltraSon();
je lance la fonction US->mesure();
c'est OK

et si j'utilise dans mon fichier moteur.cpp
US->mesure();

j'ai une erreur qui dit que US n'est pas défini.

Merci d'avance ! Bonne journée !

Sans le code ... :confused:

Bonjour,

D'après ce que j'ai compris (difficile d'en être sur sans le code), l'objet US est défini dans main.ino. Il n'est donc pas connu de la class moteur.
Il faut donc avoir un membre capteurUltraSon * dans la class moteur et instancier la class capteurUltraSon dans la class moteur (si elle n'est utiliser qu'ici) ou passer l'adresse (ou la référence) de US à la class moteur dans le constructeur pas exemple.

Maintenant est ce bien judicieux d'appeler la class capteurUltraSon dans la class moteur?

Maintenant est ce bien judicieux d'appeler la class capteurUltraSon dans la class moteur?

Personnellement je dirais : pas vraiment ...
Il vaudrait mieux laisser à l'application principale le soin de piloter le moteur en fonction du capteur.

hbachetti:
Sans le code ... :confused:

Le problème c'est que c'est un code assez gros.
Je peu tout mettre si tu veux.

En fait je ne veux pas appeler la class complète dans la class moteur. Je veux juste appeler une fonction public de la class ultrason, par une fonction public qui est dans moteur.

C'est vrai que pour plus de clarté je vais vous mettre le code.
Pour expliquer, avant de démarrer les moteur je veux appeler une fonction de la class ultrason pour vérifier qu'il n'y a pas d'obstacle.
Je pense que le fait d'avoir séparé les class chacune dans un fichier h/cpp complique la chose. Du moins pour les déclarations en fait ?
Au pire je vais tout regrouper dans le main.ino et j'aurais un code de 2000 lignes moins lisible.
Ou alors je progresse et trouve une solution pour les déclarations :slight_smile:

Merci encore !

EDIT:

hbachetti:
Personnellement je dirais : pas vraiment ...
Il vaudrait mieux laisser à l'application principale le soin de piloter le moteur en fonction du capteur.

En fait j'ai consu le programme de cette façon. :
Lorsque je veux faire une manœuvre par exemple le demi tour, je la fais en plusieurs étapes.

1 je stop
2 un quart de tour
3 je vérifie qu'il n'y ai pas d'obstacle
4 j'avance
5 stop
6 quart de tour
7 vérifie obstacles
8 j'avance

Donc avant d'avancer je dois demander au capteur ultra son si il y a un obstacles.
Sauf que j'ai créé ça de façon à ce que ce soit géré par la class moteur.

Voilà pourquoi je souhaite appeler mes ultrason depuis une fonction qui est de la class moteur.

Parce que si je fais tourner les ultra son en permanence et mon gyroscope sa bug.
Je ne sais pas pourquoi, alors l'idée est de faire fonctionner seulement quand il faut le capteur ultrason

EDIT2:
en cherchant j'ai vue qu'il fallait inclure toute les librairie dans chaque cpp
C'est à dire ultrason.h dans le moteur.cpp
Ce qui devrait résoudre le fait que la class ultrason ne soit pas déclaré.
Apparemment l'ide arduino compile chaque fichier séparément puis le. Ino
Donc si je comprend bien,
Dans mon fichier moteur.cpp je vais faire
#include ultrason.h
Avec un
Extern ultrason US = ultrason();

Et dans le main.ini
Creer l'objet
Ultrason US = ultrason();

Autre question, pour les pros des pointeurs.
Si je crée mon objet comme ceci maClass class1 = maClass();
Je vais acceder à la variable
class1.pin1 =1;

Et si je fais maClass *class1 = new maClass();
Je dlis utiliser
class1->pin1=1

Dites moi si je me trompe

Si je crée de la première manière class1 et ensuite un class2, la variable pin1 ne sera pas différente dans class1 et class2 ?
Alors que si je fais de la deuxième manière
J'attriburai à class1 la pin1 = 1 et class2 pin1=34
En gros si c'est la deuxième manière c'est un clone, de la class avec chaque objet différent l'un des autres. C'est à dire orientée objet

Les objets c'est assez complexe et je ne trouve pas d'endroit ou on parle de class sans new. Peut être parce que sa ne rime à rien car une classe est vraiment faite pour du poo, mais sa marche dans le compilateur alors...

Merci !

Heu ... pas vraiment

Extern ultrason US = ultrason();

// plutôt :

extern ultrason US;

Dites moi si je me trompe

Non, bien sûr mais il faut savoir qu'un opérateur new() implique une allocation dynamique de mémoire, plutôt déconseillé sur des petites plateformes comme ARDUINO.

En gros si c'est la deuxième manière c'est un clone, de la class avec chaque objet différent l'un des autres. C'est à dire orientée objet

Dans les deux cas c'est une instance, deux objets séparés.

class1.pin1 =1;

Tu sais que tu peux passer le N° de pin au constructeur ?
En général, on n'accède pas aux variables membres d'un objet comme tu le fais.

D'accord, merci pour ta réponse.

Donc normalement
Inclure les h dans chacun de mes cpp et donc créer un variable
Extern ultrason US; devrait régler le problème ?

Je test ça dès que possible merci !