Go Down

Topic: Objet d'une classe en paramètre dans une autre classe (Read 347 times) previous topic - next topic

Geeks

Alors, que ce passe-t-il avec l'autre solution ?
Par ce que, du coup... ça jette un doute ! En effet, si c'est pas élégant, c'est qu'il y a moyen d'optimiser le code et là, ou ouvre la suite du sujet.

Ma question sera donc, comment modifier le code qui fonctionne par celui qui devrais fonctionné et qui est élégant.

C'est intéressant de creuser ce sujet.

supercc

De l'extérieur ce n'est pas grave ;-) ta solution fonctionne bien, c'est juste qu'en général on fait un choix de notation : référence ou pointeur. Dans ton code tu as les 2 notations (passage par référence de l'objet mais sa mémorisation est faite avec un pointeur). Cela n'impacte pas sur l'efficacité du code, c'est juste que le code est un poil plus compliqué à lire et qu'on se pose la question pourquoi ce passage de notation "référence" à notation "pointeur". Si tu veux que cela soit parfait fait comme hbachetti, n'utilise que des références (plus d'infos sur les références : https://cpp.developpez.com/cours/cpp/?page=page_6).


hbachetti

Tout à fait.
Juste une question d'écriture. C'est plus facile de taper _lcd.clear() que _lcd->clear().

Code: [Select]

    LiquidCrystal &_lcd;  // référence
    LiquidCrystal *_lcd;  // pointeur

    _lcd.clear();    // référence
    _lcd->clear(); // pointeur
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Geeks

Ok pour ces informations.

Mais, alors pourquoi ça compile et ça plante le µC quand j'utilise les références ?

supercc

Joue au jeu des 7 erreurs entre ton code avec référence et celui de hbachetti. Il y en a forcément au moins une ;-)

Geeks

Un peu de dérision :
Joue au jeu des 7 erreurs entre ton code avec référence et celui de hbachetti. Il y en a forcément au moins une ;-)
Avec ce genre de réponse, à part parler pour ne rien dire...

Un peu d'essais avec l'exemple donné, cité, car le blabla ne m'intéresse pas:
Le .h
Code: [Select]

#ifndef menuLCD_h
#define menuLCD_h

#include <LiquidCrystal.h>

class MenuLCD
{
  public :
    MenuLCD(LiquidCrystal &lcd);  //Constructor
    void getTest(void);
  private :
    LiquidCrystal &_lcd;
};

#endif


le .cpp
#include "menuLCD.h"

MenuLCD::MenuLCD(LiquidCrystal &lcd)
{
 _lcd = lcd;
}

void MenuLCD::getTest(void)
{
 _lcd.clear();
 _lcd.setCursor(0,0); //Colonne, Ligne
 _lcd.print("Hello world");
}

Le résultat :
Cela ne produit rien à part un joli crash du µC... Comme j'ai dit plus haut. Pourtant, il n'y a pas de différence au niveau pointeur. Ou alors, j'ai mal lu !

supercc

Ok, je pensais que c'était une bête erreur de copie...

Au final, je n'ai pas bien compris, quand tu inclues LiquidCrystal.h, c'est le .h officiel ou celui que tu as modifié ? Parce que ta version diffère pas mal (au niveau des constructeurs) de la version officielle.


kamill

Cela ne produit rien à part un joli crash du µC... Comme j'ai dit plus haut. Pourtant, il n'y a pas de différence au niveau pointeur. Ou alors, j'ai mal lu !
Effectivement, tu as raison, il ne faut pas affecter la valeur passée à la référence mais appeler le constructeur pour l'initialiser.

menu.cpp
Code: [Select]
#include "menuLCD.h"

MenuLCD::MenuLCD(LiquidCrystal &lcd)
: _lcd(lcd)
{
}

void MenuLCD::getTest(void)
{
 _lcd.clear();
 _lcd.setCursor(0,0); //Colonne, Ligne
 _lcd.print("Hello world");
}

 

Go Up