# POO - création librairie - création d'une classe

**URL:** <https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804>\
**Category:** Français\
**Created:** [August 13, 2022, 9:48am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804 "2022-08-13T09:48:13Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 13, 2022, 9:48am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/1 "2022-08-13T09:48:13Z")

</div>

Bonjour,  
Je me lance dans l'apprentissage du C++. J'ai acheté 3 livres, les deux premiers sont très simples et le troisième est du niveau universitaire ou d'école d'ingénieur (je ne sais pas encore si je pourrai aller jusqu'au bout !). J'ai attaqué le premier mais les trois reprennent le C (c'est bien normal), ce qui me rend impatient. Du coup parallèlement à mes lectures j'essaye par mes propres moyens de créer une librairie. Je vous présente ce que j'ai fait :  
A partir de deux `int`, une classe nommée `Calcul` possède deux méthodes une qui multiplie les deux chiffres et l'autre qui les soustrait :  
1/ **fichier d'en tête**

```cpp
#ifndef Calcul_h
#define Calcul_h

#include <Arduino.h>

class Calcul{
public:
Calcul(int A,int B);
int calculMult(void);
int calculSous(void);
private:
int _A;
int _B;
int C;
};
#endif

```

2/ **Le fichier source**

```cpp
#include "Calcul.h"

Calcul::Calcul(int A,int B) {
_A = A;
_B = B;
}

int Calcul::calculMult(){
C = _A * _B;
return C;
}
int Calcul::calculSous() {
C = _A - _B;
return C;
}

```

3/ **Le fichier` ino`**

```cpp
#include <Calcul.h>

Calcul calc(45, 15);
Calcul calc2(125, 126);

void setup() {
  Serial.begin(115200);

}

void loop() {
  Serial.print("Instance calc : "); Serial.print("\t");Serial.print(calc.calculMult()); Serial.print("\t"); Serial.println(calc.calculSous());
  Serial.print("Instance calc2 : "); Serial.print("\t");Serial.print(calc2.calculMult()); Serial.print("\t"); Serial.println(calc2.calculSous());
}

```

Sur arduino uno j'ai 4 `warning` :

```cpp
D:\Utilisateur\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.5\cores\arduino\new.cpp: In function 'void* operator new(std::size_t, std::nothrow_t)':
D:\Utilisateur\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.5\cores\arduino\new.cpp:59:60: warning: unused parameter 'tag' [-Wunused-parameter]
 void * operator new(std::size_t size, const std::nothrow_t tag) noexcept {
                                                            ^~~
D:\Utilisateur\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.5\cores\arduino\new.cpp: In function 'void* operator new [](std::size_t, const std::nothrow_t&)':
D:\Utilisateur\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.5\cores\arduino\new.cpp:68:63: warning: unused parameter 'tag' [-Wunused-parameter]
 void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept {
                                                               ^~~
D:\Utilisateur\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.5\cores\arduino\new.cpp: In function 'void operator delete(void*, const std::nothrow_t&)':
D:\Utilisateur\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.5\cores\arduino\new.cpp:103:55: warning: unused parameter 'tag' [-Wunused-parameter]
 void operator delete(void* ptr, const std::nothrow_t& tag) noexcept {
                                                       ^~~
D:\Utilisateur\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.5\cores\arduino\new.cpp: In function 'void operator delete [](void*, const std::nothrow_t&)':
D:\Utilisateur\Documents\ArduinoData\packages\arduino\hardware\avr\1.8.5\cores\arduino\new.cpp:106:57: warning: unused parameter 'tag' [-Wunused-parameter]
 void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept {
                                                         ^~~

```

**Pourtant ça téléverse et ça fonctionne parfaitement ...**

```cpp
Instance calc : 675	30
Instance calc2 : 15750	-1

```

**Il y a quelque chose que j'ai mal fait mais je n'arrive pas à trouver quoi.**

Merci pour votre patience.

---

<div class="post-metadata">

**Author:** ![fdufnews](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fdufnews/32/238836_2.png) [@fdufnews](https://forum.arduino.cc/u/fdufnews)\
**Post date:** [August 13, 2022, 10:20am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/2 "2022-08-13T10:20:17Z")

</div>

Aucun problème 0 warning.  
Peut-être faire le ménage dans le répertoire temporaire où sont conservés les résultats de compilations précédentes.

---

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 13, 2022, 10:26am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/3 "2022-08-13T10:26:08Z")

</div>

Merci @fdufnews,  
Je vais voir de ce côté.  
Sur ESP32, ça ne téléverse pas du tout :

```cpp
In file included from D:\Utilisateur\Documents\ArduinoData\packages\esp32\hardware\esp32\2.0.4\cores\esp32/WCharacter.h:23,
                 from D:\Utilisateur\Documents\ArduinoData\packages\esp32\hardware\esp32\2.0.4\cores\esp32/Arduino.h:164,
                 from sketch\Calcul_Biblio.ino.cpp:1:
D:\Utilisateur\Documents\Arduino\libraries\Calcul/Calcul.h:13:5: error: expected unqualified-id before numeric constant
 int _B;
     ^~
exit status 1
Erreur de compilation pour la carte DOIT ESP32 DEVKIT V1

```

---

<div class="post-metadata">

**Author:** ![vileroi](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/vileroi/32/1035780_2.png) [@vileroi](https://forum.arduino.cc/u/vileroi)\
**Post date:** [August 13, 2022, 10:56am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/4 "2022-08-13T10:56:30Z")

</div>

> [@philippe86220](#):
>
> Sur arduino uno j'ai 4 `warning` :

Sur uno, je n'ai aucun warnings, cela semble ne pas venir du code.

---

<div class="post-metadata">

**Author:** ![biggil](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/biggil/32/235671_2.png) [@biggil](https://forum.arduino.cc/u/biggil)\
**Post date:** [August 13, 2022, 12:15pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/5 "2022-08-13T12:15:38Z")

</div>

le membre C de ta classe est inutile. Il consomme quelques octets pour rien.  
Tu peux faire

```cpp
int Calcul::calculMult(){
  int produit = _A * _B;
  return produit;
}

```

Par ailleurs, pour cette classe, tu ferais mieux de stocker non pas A et B, mais A\*B et A-B, pour ne pas les recalculer à chaque appel.

---

<div class="post-metadata">

**Author:** ![terwal](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/terwal/32/1098571_2.png) [@terwal](https://forum.arduino.cc/u/terwal)\
**Post date:** [August 13, 2022, 12:33pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/6 "2022-08-13T12:33:02Z")

</div>

@philippe86220, l'erreur indique que l'opérateur new est définit avec 3 paramètres, mais que l'implémentation n'utilise pas le paramètre tag.  
Donc c'est normal que le programme fonctionne et comme le problème se situe dans le framework d'Arduino, le problème ne vient pas de ton programme.  
Tu n'a pas les même warning si tu n'utilise pas ta classe?

Je suis surpris de ton erreur avec l'ESP32, j'ai l'impression que le fichier d'en-tête t'empêche d'utiliser le caractère \_ en début de variable.  
Tu peux juste essayer de ne pas nommer tes variables global avec ce caractère?

---

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 13, 2022, 1:55pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/7 "2022-08-13T13:55:29Z")

</div>

Merci @terwal, vous avez raison sur ESP32 bizarrement ` _` ne passe pas, du coup je n'ai plus d'erreur sur cette plateforme.

```arduino
#ifndef Calcul_h
#define Calcul_h

#include <Arduino.h>

class Calcul{
public:
Calcul(int A,int B);
int calculMult();
int calculSous();
private:
int vA;
int vB;
};
#endif

```

```arduino
#include "Calcul.h"

Calcul::Calcul(int A,int B) {

vA = A;
vB = B;
}

int Calcul::calculMult(){
int produit = vA * vB;
return produit ;
}
int Calcul::calculSous() {
int soust = vA - vB;
return soust ;
}

```

> [@biggil](#):
>
> le membre C de ta classe est inutile. Il consomme quelques octets pour rien.  
> Tu peux faire

Merci @biggil,J'ai pris en compte votre remarque.

**Sur Uno j'ai remarqué qu'aprés lancement de l'IDE 1.8.19, les `warning` sont présents au premier téléversement mais pas si je téléverse de nouveau. Bizarre...**

---

<div class="post-metadata">

**Author:** ![kamill](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/kamill/32/221875_2.png) [@kamill](https://forum.arduino.cc/u/kamill)\
**Post date:** [August 13, 2022, 2:00pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/8 "2022-08-13T14:00:01Z")

</div>

> [@philippe86220](#):
>
> Sur ESP32, ça ne téléverse pas du tout :
> 
> ```arduino
> In file included from D:\Utilisateur\Documents\ArduinoData\packages\esp32\hardware\esp32\2.0.4\cores\esp32/WCharacter.h:23,
> from D:\Utilisateur\Documents\ArduinoData\packages\esp32\hardware\esp32\2.0.4\cores\esp32/Arduino.h:164,
> from sketch\Calcul_Biblio.ino.cpp:1:
> D:\Utilisateur\Documents\Arduino\libraries\Calcul/Calcul.h:13:5: error: expected unqualified-id before numeric constant
> int _B;
> ^~
> 
> ```

Si on sélectionne un ESP32 \_B est une macro définie dans ctype.h  
`#define	_B	0200`

---

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 13, 2022, 2:01pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/9 "2022-08-13T14:01:13Z")

</div>

Merci @kamill du coup ceci explique cela ...

---

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 13, 2022, 2:05pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/10 "2022-08-13T14:05:48Z")

</div>

> [@fdufnews](#):
>
> Peut-être faire le ménage dans le répertoire temporaire où sont conservés les résultats de compilations précédentes.

Il est où ce répertoire @fdufnews ? Peut-être AppData/Local/Temp ?  
Merci.

---

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 13, 2022, 2:31pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/11 "2022-08-13T14:31:55Z")

</div>

![temp arduino](https://europe1.discourse-cdn.com/arduino/original/4X/5/c/d/5cda40c75aa7a3617a4e1b4dbf0ec0298972391a.jpeg)

Oui c'est bien ce répertoire mais le netoyage ne change rien. Les messages sont présents pour tous les progs où j'utilise des bibliothèques et uniquement au premier téléversement sur UNO.

---

<div class="post-metadata">

**Author:** ![fdufnews](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fdufnews/32/238836_2.png) [@fdufnews](https://forum.arduino.cc/u/fdufnews)\
**Post date:** [August 13, 2022, 3:18pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/12 "2022-08-13T15:18:55Z")

</div>

> [@philippe86220](#):
>
> Les messages sont présents pour tous les progs où j'utilise des bibliothèques et uniquement au premier téléversement sur UNO.

Oui, parce que les fichiers compilés sont conservés dans un répertoire temporaire. Si le fichier compilé n'est pas modifié il n'est pas recompilé et donc les warning ne remontent pas

---

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 13, 2022, 4:05pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/13 "2022-08-13T16:05:05Z")

</div>

Merci @fdufnews.  
J'ai tout réinstaller et ça refonctionne correctement. Oupssssssss  
J'aurai peut-être pu faire plus simple mais je n'ai pas trouvé.

Merci.

---

<div class="post-metadata">

**Author:** ![biggil](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/biggil/32/235671_2.png) [@biggil](https://forum.arduino.cc/u/biggil)\
**Post date:** [August 14, 2022, 5:06am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/14 "2022-08-14T05:06:05Z")

</div>

pour parfaire la déclaration de ta classe, il faudrait ajouter l'attribut **const** aux 2 méthodes.

```cpp
int calculMult() const;
int calculSous() const;

```

En effet ces deux méthodes ne modifient pas les membres de la classe.  
On pourrait croire que c'est -juste de la décoration, mais non.  
C'est une excellente habitude de programmation que de déclarer **const** les méthodes qui le sont.  
Ca servira un jour, je te garantis.

---

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 14, 2022, 7:35am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/15 "2022-08-14T07:35:55Z")

</div>

Merci @biggil,  
Du coup ==\>

```cpp
#ifndef Calcul_h
#define Calcul_h

#include <Arduino.h>

class Calcul{
public:
Calcul(int A,int B);
int calculMult() const;
int calculSous() const;
private:
int vA;
int vB;
//int C;
};
#endif

```

```cpp
#include "Calcul.h"

Calcul::Calcul(int A,int B) {

vA = A;
vB = B;
}

int Calcul::calculMult() const {
int produit = vA * vB;
return produit ;
}
int Calcul::calculSous() const {
int soust = vA - vB;
return soust ;
}

```

Je retiens que mes deux méthodes ne modifient pas l’objet pour lequel elle sont appelées, du coup elle peuvent être déclarées comme constantes. Au même titre q'une donnée constante classique, cela permet au code généré de disposer de la valeur immédiate plutôt que d'aller la chercher dans la case ou a été stockée la valeur d'une variable. **Ici, il s'agit de disposer du résultat d'un calcul ?**

---

<div class="post-metadata">

**Author:** ![biggil](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/biggil/32/235671_2.png) [@biggil](https://forum.arduino.cc/u/biggil)\
**Post date:** [August 14, 2022, 8:31am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/16 "2022-08-14T08:31:14Z")

</div>

encore 2 choses et ta classe commencera à avoir de la gueule.  
1-  
Tu n'as pas déclaré de _destructeur_. Ici tu n'en as pas besoin bien sûr, mais c'est une bonne habitude d'en déclarer un, même vide. Ainsi, le jour où ta classe se complexifie et a besoin d'un destructeur, le code est déjà là (même vide) tu auras moins tendance à l'oublier. Donc:  
`~Calcul () {}`

2 - Il faut _indenter_ ton code correctement pour le rendre plus lisible. Dans l'IDE Arduino, rien de plus facile : tu tapes Control-T (ou pomme-T sur Mac)

---

<div class="post-metadata">

**Author:** ![biggil](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/biggil/32/235671_2.png) [@biggil](https://forum.arduino.cc/u/biggil)\
**Post date:** [August 14, 2022, 8:38am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/17 "2022-08-14T08:38:06Z")

</div>

> [@philippe86220](#):
>
> Ici, il s'agit de disposer du résultat d'un calcul ?

??? pas compris la question.  
**const** est un engagement moral que prend que une fonction membre à ne pas modifier l'objet auquel elle s'applique. C'est tout, n'y cherche rien d'autre.  
C'est une sécurité pour le programmeur qui utilise la fonction : il est sûr que l'objet ne sera pas modifié.

---

<div class="post-metadata">

**Author:** ![philippe86220](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/philippe86220/32/733778_2.png) [@philippe86220](https://forum.arduino.cc/u/philippe86220)\
**Post date:** [August 14, 2022, 9:46am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/18 "2022-08-14T09:46:43Z")

</div>

Merci @biggil,  
Voilà :

```cpp
#ifndef Calcul_h
#define Calcul_h

#include <Arduino.h>

class Calcul {
  public:

    // Constructeur
    Calcul(int A, int B);
    int calculMult() const;
    int calculSous() const;

    // Destructeur
    ~Calcul();

  private:
    int vA;
    int vB;
    //int C;
};
#endif

```

```cpp
#include "Calcul.h"

// Initialisation
Calcul::Calcul(int A, int B) {

  vA = A;
  vB = B;
}

int Calcul::calculMult() const {
  int produit = vA * vB;
  return produit ;
}
int Calcul::calculSous() const {
  int soust = vA - vB;
  return soust ;
}

// Destruction
Calcul::~Calcul() {}

```

Je n'avais pas identé mon code car je travaillais avec des fichiers TXT.

Merci beaucoup  
Bon dimanche.

---

<div class="post-metadata">

**Author:** ![biggil](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/biggil/32/235671_2.png) [@biggil](https://forum.arduino.cc/u/biggil)\
**Post date:** [August 14, 2022, 11:35am UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/19 "2022-08-14T11:35:55Z")

</div>

il n'y a aucun besoin d'inclure Arduino.h dans le .h de ta classe.

Enfin, pour initialiser les membres dans le constructeur, on écrit plutôt :

```cpp
Calcul::Calcul(int A, int B) 
: vA ( A ),
  vB ( B )
{}

```

Ici ça ne change rien, mais parfois il n'est pas possible d'initialiser un membre par une affectation explicite (en fait, après la construction des classes de base, il n'y en a pas ici)

---

<div class="post-metadata">

**Author:** ![vileroi](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/vileroi/32/1035780_2.png) [@vileroi](https://forum.arduino.cc/u/vileroi)\
**Post date:** [August 14, 2022, 12:18pm UTC](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804/20 "2022-08-14T12:18:59Z")

</div>

J'avais appris dans ma jeunesse qu'il y avait des conventions d'écriture en C, à savoir que les variables et les noms de fonctions s'écrivaient avec des minuscules (une majuscule en début de mot pour séparer), les constantes en majuscules et les noms des classes avec une majuscule suivie de minuscules. Cela donnerait:  
`Calcul::Calcul(int a, int b)`  
Plus compliqué pour vA car on peut l'entendre comme valeur de a.  
et la création serait: `Calcul Calc(45, 15);`

Doit on préférer ces conventions? Je remarque bien souvent des déclarations de pins style  
`const int pinMoteur = 2;`  
alors que j'aurais tendance à écrire:  
`const byte PIN_MOTEUR = 2;`

* * *

* * *
Je me pose aussi la question de la préférence entre:

```cpp
int Calcul::calculMult() const {
  int produit = vA * vB;
  return produit ;
}

```

et

```cpp
int Calcul::calculMult() const {
  return vA * vB;
}

```

La variable supplémentaire semble ne pas être créée, la taille du code et des données est la même. J'ai tendance à supprimer les variables inutiles. Le code plus compact est-il plus facile à lire? J'ai l'impressions que moins on a de variables à mémoriser mieux cela vaut. Il est vrai que j'ai commencé la programmation du temps ou le compilateur n'optimisait quasiment pas, et que l'optimisation était faite par le programmateur lui-même (une division par 2^n n'était pas transformée en décalage par exemple)

[Next page](https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804.md?page=2)
