Salut les amis
Dans notre projet sur micro-contrôleur, on a fait des classes pour wrapper une bibliothèque de drivers écrite en C. Il arrive que ces classes ne possède pas de données membres (par exemple, quand on wrappe un module ADC et qu'il n'y en a qu'un seul ADC sur le micro) et souvent la donnée membre se résume à un pointeur (généralement caché par un typedef de la bibliothèque C).
Voici par exemple ce que donne une classe pour la gestion des bus I2C :
Ici, les fonctions read() et write() ne sont pas marquées comme const mais bien sûr elle ne change pas le handle C. Il sera le même tout au long de la vie d'un objet I2C.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include "bibliotheque_drivers.h" class I2C { public: // Creation a partir d'un handle C (normalement une adresse vers un peripherique "memory-mapped") explicit I2C(I2C_HandleTypeDef* I2Cx); // Non copiable I2C(const I2C&) = delete; I2C& operator=(const I2C&) = delete; // Operations de lecture / ecriture qui deleguent a des fonctions C qui prennent le handle C en parametre bool readFrom(std::uint8_t dest, std::uint8_t* data, std::size_t length); bool writeTo(std::uint8_t dest, const std::uint8_t* data, std::size_t length); private: I2C_HandleTypeDef* I2Cx_m; };
D'un point de vue const-correctness pur, je pourrais ajouter const et mettre un mutable si besoin (je crois en fait que ça compile sans pour cette classe-ci...).
D'un point de vue plus général, c'est quand même étonnant de dire qu'une fonction qui s'appelle write(), qui va écrire des données et donc d'une certaine manière "modifier" le bus physique, est const.
Est-ce que la const-correctness ne devrait se juger que d'un point de vue compilation (je modifie un champ, je ne peux pas être const ; je ne modifie aucun champ, je peux l'être) ou est ce que ça s'applique aussi d'un point de vue action de la classe (je modifie une base de données mais mon handle vers la base est inchangée, alors je ne suis pas vraiment const) ? Qu'en pensez-vous ?
Partager