[C++] pointeur sur classe et appel d'une méthode

a marqué ce sujet comme résolu.

Hello les Zestes,

Je rencontre un problème en C++, mais plutôt que de grandes explications, voici le code :

J’ai une classe dans contexte.h :

class Contexte
{
  public:
    Contexte(bool prete);
    ...
    void Configure(uint8_t sdaPin, uint8_t sclPin);
    ...
  private:
    bool prete = false;
    U8X8_SSD1306_128X64_NONAME_SW_I2C *u8x8;
    ...

};

Le contexte.cpp

#include "contexte.h"

...
void Contexte::Configure(uint8_t sdaPin, uint8_t sclPin)
{
  this->u8x8 = new U8X8_SSD1306_128X64_NONAME_SW_I2C(sclPin, sdaPin, U8X8_PIN_NONE);
  this->*u8x8.clear(); // Problème ici
}
...

Le membre u8x8 est de type U8X8_SSD1306_128X64_NONAME_SW_I2C qui vient d’une librairie qui m’est imposée. Voici mon problème, je ne sais pas comment appeler la méthode clear() de l’objet u8x8 dans la méthode Contexte::Configure de ma classe. Serait-ce un problème de parenthèses ?

merci d’avance,

Tu déréférences un pointeur sur une classe, deux syntaxes sont possibles dont une que tu utilises déjà : this->u8x8->clear(); ou this->(*u8x8).clear();

Ta syntaxe ne fonctionne pas à cause de la priorité des opérateurs qui rend ton déférencement invalide. Je te conseille d’utiliser la première syntaxe systématiquement, plus jolie et usuelle.

+0 -0

Merci, la première solution fonctionne effectivement.

Par contre pas la seconde, que j’avais déjà testée. Et je ne comprends pas pourquoi.

In member function 'void Contexte::Configure(uint8_t, uint8_t)’: contexte.cpp:24: error: expected unqualified-id before '(' token this->(*u8x8).clear(); ^ exit status 1 expected unqualified-id before '(' token

Salut,

Ce n’est en fait pas une syntaxe correcte !
Tu dois acquérir ton pointeur avec this->u8x8 et ensuite le déréférencer avec l’opérateur * puis accéder à son champ avec .clear(), ce qui donne *(this->u8x8).clear()

Mais oui, l’opérateur -> est bien plus pratique et lisible

et ce n’est pas la peine d’accèder au champ au travers this, tu peux écrire directement u8x8->clear()

Concernant le this non obligatoire, je savais, mais l’indiquer me permet de voir de façon beaucoup plus claire si une variable est un membre ou pas.

vohu

Pour cela on utilise usuellement une convention de nommage des variables, en préfixant généralement le nom de la variable par m_ ou simplement _ on indique qu’il s’agit d’une variable membre

Théoriquement, en écrivant this-> tu indiques une opération de déréférencement et donc perd inutilement quelques instructions de calcul, mais je suppose (j’espère) que les bons compilateurs le repère et effectue l’optimisation tout seul, donc c’est pas trop grave

Concernant le this non obligatoire, je savais, mais l’indiquer me permet de voir de façon beaucoup plus claire si une variable est un membre ou pas.

vohu

Normalement, tu n’es sensé avoir qu’une vision très restreinte de ce qui entoure ton code. Typiquement, avoir peu de variables auxquelles penser (sinon, ça laisse penser que le couplage est trop fort ou la classe trop grosse), donc cette distinction ne devrait pas trop poser de problème (ni être si importante). Si vraiment ton état interne est hyper important, tu devrais de toute façon avoir une assertion en fin de fonction membre pour voir si tu as maintenu un état cohérent.

Et si vraiment tu veux voir cette distinction, préfixer ou suffixer le membre (par exemple "m_") permettra d’obtenir la même distinction avec quelque chose de beaucoup moins lourd à la lecture que "this->".

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte