Classes et Objets syntaxe et visibilité

Bonjour,

Je ne trouve pas pourquoi j'ai l'erreur de compilation 'MyObj' does not name a type. L'instanciation me semble Ok.

A l'aide SVP un habitué de C++ verra probablement tout de suite mon erreur.

class Myclass
{
public:
  Myclass(void);
  int F2(void); 
  void set(void);
  static int memvar;
private:

};
// Constructeur
Myclass::Myclass(void){
}
int Myclass::F2(void) {
  return memvar;
}
void Myclass::set(void) {
  memvar = 99;
}

//====================================================================================
Myclass MyObj();
MyObj.set();

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(2000);
  Serial.print("Exécute set  ");
  Serial.print("Exécute F2");
  Serial.print(" ");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
}

Merci
Serge

Bonsoir,
Je pense que c'est ce que vous cherchez à faire :

class Myclass
{
  private:
    int memvar;

  public:
    int F2();
    void set();
};

// Définition des méthodes.
int Myclass::F2() {
  return memvar;

}
void Myclass::set() {
  memvar = 99;
}

//====================================================================================
Myclass MyObj;

void setup() {


  Serial.begin(115200);
  Serial.println("Exécute set...  ");
  MyObj.set();
  Serial.print("Exécute F2, memvar vaut : "); Serial.println( MyObj.F2());
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
}

Mais en réalité la gestion des classes est bien plus complexe que ça (fichiers H - CPP ...)
Je vous conseille de vous documenter sur le web, ce ne sont pas les cours qui manquent.

Très bonne soirée à vous.

PS : pensez à mettre votre moniteur série à 115200.

Merci beaucoup Philippe, il me reste beaucoup a apprendre. Votre code fonctionne très bien, je vais m'affairer a comprendre ou était l'erreur principale.
Serge

Bonjour Serge,

Je dirai qu'essentiellement vous commettez une erreur lorsque vous créé une instance de votre classe :

  • vous procédez comme ceci : Myclass MyObj();
  • vous devez l'instancier de cette manière : Myclass MyObj;

D'autre part, vos méthodes doivent être appelées soit dans le setup soit dans la loop. Voilà en gros ce qui ne va pas.

Voici un lien qui pourrait vous aider dans la compréhension de la manière dont on gère une classe au travers d'une libraire :

Voyez éventuellement comment il faut placer votre constructeur, qu'il vaut mieux prévoir un destructeur ... :wink:

S'il fallait décrire le fonctionnement d'une classe, on pourrait écrire facilement un livre de plus de 500 pages tant le sujet est vaste.

Bon dimanche :wink:

Philippe,

Merci du complément de réponse, de votre temps et de votre patience, le lien cité m'apparait très enrichissant, je vais prendre le temps de le consulter attentivement.

Serge

Suite a la résolution de mon problème et après avoir complété cet exercice personnel sur les classes et les objets C++ j'ai pensé que la publication du code ci joint pourrais être utile d'autres débutants dans le monde des classes. L'exercice fonctionnel sur Esp32 présente un exemple des cas les plus fréquents dans l'utilisation des objets et classes, voir les commentaires pour les détails.
Désolé si les conventions d'écriture sont quelque peu massacrées.

// Cette démo met démontre l'utilisation d'une méthode de classe
// d'une variable de classe d'une instanciation et de l'utilisation
// d'une variable privée connue seulement des 2 méthodes de la classe.
// Elle montre aussi la methode d'utilisation d'un constructeur sans 
// arguments et prouve son appel a l'instantiation d'un objet. Elle a 
// été compilée et vérifiée avec l'IDE Arduino 2.2.1 et ESP32 Dev module.

class Myclass
{
public:
  Myclass();                 // Le constructeur sans arguments
  int get(void);             // Une méthode
  void set(void);            // Une méthode
  static int clsmethod(int); // Une méthode de classe
  static int vardeclass;     // Une variable de classe 
  int ShowInit(void);        // Une méthode

private:
  int memvar;                // Une variable privée
  int temp;                  // Une variable privée
  void GetInit(int);         // Une méthode privée
};

int Myclass::vardeclass=4567; // Initialisation Var de classe

// Constructeur
Myclass::Myclass(){
temp = 9876;
}

int Myclass::clsmethod(int x){
return x;
}

int Myclass::get(void) {
  return memvar;
}
void Myclass::set(void) {
  memvar = 678;
}

void Myclass::GetInit(int tmp) {
  temp=tmp;
}

int Myclass::ShowInit(void) {
  return temp; 
}

//==============================================================

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115600);
  delay(3000);

  Myclass::clsmethod(1234);    // Méthode de classe non instanciee.
  Myclass::vardeclass=4321;  // Variable de classe non instanciee.

  Myclass MyObj;              		        // Constructeur sans arg exécuté
  Serial.println("Exécute set  ");		
  MyObj.set();				       // Méthode de l'objet MyObj
  Serial.println("Exécute get ");	
  Serial.println(MyObj.get());		      // Méthode de l'objet MyObj
  Serial.print("Clsmethod Valeur");
  Serial.println(Myclass::clsmethod(1234));  // Montre que la méthode de classe fonctionne
  Serial.print("vardeclass Valeur");
  Serial.println(Myclass::vardeclass);        // Montre que la var de classe fonctionne
  Serial.println(" Constructeur init OK: ");
  Serial.println(MyObj.ShowInit());	     // Montre que le constructeur fonctionne
}
void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.