Arduino Forum

International => Français => Topic started by: renaudyes on Aug 22, 2013, 09:20 pm

Title: Requête get et this. sur arduino
Post by: renaudyes on Aug 22, 2013, 09:20 pm
Bonjour à toutes et à tous,
J'ai un petit soucis concernant les requêtes "get" habituelle en java.
Petit exemple de programme :
Code: [Select]
#include "NomDeLaClass.h"

String name;
NomDeLaClass::NomDeLaClass(String name)
{
  this.name = name;// je veux faire référence au name au dessus
    //Constructeur
}
String NomDeLaClass:: getName()
{
  return name;
}


Code qui ne compile pas : error: request for member 'name' in 'this', which is of non-class type 'NomDeLaClass* const'

Ce qui compile c'est
Code: [Select]
name = name mais on fait pas référence à l'objet courant ... ce qui n'est pas bon.

Mon but est de pouvoir faire un constructeur.uneMethode() pour avoir une de ces variables déclarée préalablement, ce qui simplifierais pas mal de mes codes.
L'objet this peut il être utilisé? Je vois qu'il est colorié en rouge mais je ne suis jamais arrivé à l'utilisé... J'ai déjà tapé sur google "arduino this", ... mais je ne trouve aucun résultat.

Quelqu'un peut il m'éclaircir ?
Merci beaucoup

PS : je me permet de demandé aussi comment on utilise le private ? Quand je fais :
Code: [Select]
private int x; arduino me renvoie une erreur: expected unqualified-id before 'private'
Est ce que le simple fait de déclaré une variable private dans le header ( nomDeLaClass.h) la rend réellement private ?
Title: Re: Requête get et this. sur arduino
Post by: fdufnews on Aug 22, 2013, 09:58 pm
Voir là l'utilisation de this http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr035.htm (http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr035.htm)
ou là:http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/le-pointeur-this (http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/le-pointeur-this)

Quote
Est ce que le simple fait de déclaré une variable private dans le header ( nomDeLaClass.h) la rend réellement private ?

oui
Title: Re: Requête get et this. sur arduino
Post by: XavierMiller on Aug 22, 2013, 10:06 pm
Hello,

C'est du C++, pas du Java ;)

Comment as-tu défini "name" ? Celui qu'on voit dans ton extrait ne fait pas partie de ta classe.
Title: Re: Requête get et this. sur arduino
Post by: renaudyes on Aug 22, 2013, 10:18 pm
Effectivement, je me trompe de programmation :(.
Alors, j'ai défini dans le header un
private : String name ;
Donc, il est bien présent. Je viens de comprendre pour le private, on ne peut déclarer cette variable que dans une classe ? Les autres sont d'office public ?
Voici le code revu ( par contre, ici j'ai pas ma classe NomDeLaClass, donc je sais pas si ce code fonctionne.

Code: [Select]
#include "NomDeLaClass.h"
String name // sert  à rien
NomDeLaClass::NomDeLaClass(String name)
{
  this->name = name;// devrait alors fonctionner?
    //Constructeur
}
String NomDeLaClass:: getName()
{
  return name;
}
Title: Re: Requête get et this. sur arduino
Post by: XavierMiller on Aug 22, 2013, 10:26 pm
Hello,

Cela devrait fonctionner. Evite d'avoir le même nom de membre de classe ou de variable, utilise par exemple des conventions pour les séparer.

Ex:
Code: [Select]
class MaClasse
{
private:
  String _name;

public:
  String getName() { return _name; }
  void setName(const String &newName) { _name = newName; }
};


Par défaut, tout est private dans une class en C++.
Title: Re: Requête get et this. sur arduino
Post by: renaudyes on Aug 23, 2013, 10:09 am
Salut,
Je pense avoir compris tout ça.
Quelques dernière questions tant qu'on y est :p.
Pourquoi y a t'il un "&", est ce simplement une convention comme le "_" pour le private?
Parce que le code fonctionne avec ou sans.

Maintenant, j'ai voulu faire un peu plus fort :).
J'ai importé une librairie de type OneWire. ( constructeur : Onewire myWire ( int pin ) )
Je veux donc à partir de la class NomDeLaClass prendre un type int et créé un objet OneWire.
Pour cela j'utiliserais une fonction setSensor(const OneWire capteur) comme tu l'as fait.

J'ai donc :
Code: [Select]


#ifndef NOM_DE_LA_CLASS_HEADER
#define NOM_DE_LA_CLASS_HEADER      //Evite les inclusions multiples
#include <OneWire.h>
#include "Arduino.h"

class NomDeLaClass
{
  private:
  String _name;
  OneWire _wire();
   //Méthodes et variables privées

  public:
   NomDeLaClass(int pin);  
   void setName(String newName); // j'ai essayé ton truc
   void setSensor ( const OneWire capteur); // je veux faire de même avec une autre classe
   //Constructeur de la class
   //Méthodes et variables public

};

#endif


et :
Code: [Select]
#include "NomDeLaClass.h"
#include <OneWire.h>

NomDeLaClass::NomDeLaClass(int pin )
{

}
void NomDeLaClass :: setName(String newName)
{
 _name = newName;
}
void NomDeLaClass :: setSensor(const OneWire capteur)
{
 _wire = capteur; // je veux donc que wire fait référence au capteur.
}

En somme  quand je fais _wire.uneMethod, cela reviens au même que capteur.uneMethod
Mais cela me permettra de jouer avec autant de capteur que je veux tant que je créé un objet différent.
Malheureusement je reçois une erreur :
Code: [Select]
NomDeLaClass.cpp: In member function 'void NomDeLaClass::setSensor(OneWire)':
NomDeLaClass.cpp:14: error: invalid use of member (did you forget the '&' ?)

Et j'avoue, je ne l'a comprend pas. D'après moi, le "&" n'est donc pas une convention ... pourtant je n'ai rien trouvé de convaincant sur internet :(

En regardant sur internet, j'ai vu que que certains exemples sont donné avec int &x=3 et qu'ils disent faire référence à une variable x. Donc le "&" signifie quelque chose .... mais quoi :s
Un exemple que j'ai lu :
Code: [Select]



It means you're passing the variable by reference.

In fact, in a declaration of a type, it means reference, just like:

int x = 42;
int& y = x; // mais ca revient strictement au même que de faire int y = x ... non?

declares a reference to x, called y.


Et la toute dernière chose, le const
J'ai lu que le const servait à ne pas modifié l'objet.
Ok, quand on fait un setName, je modifie  ce qu'il y a dans le String _name, et donc l'objet?
Et ce n'est pas le but ?
Code: [Select]
class MaClasse
{
private:
 String _name;

public:
 String getName() { return _name; }
 void setName(const String &newName) { _name = newName; }// on modifie le name de l'objet ?
};


J'ai vraiment besoin d'éclaircissement :( ...
Merci !
Title: Re: Requête get et this. sur arduino
Post by: XavierMiller on Aug 23, 2013, 10:13 am
Le "&" indique qu'on passe l'argument par référence (pointeur) plutôt que par valeur (qu'on copie). C'est plus efficace au niveau ressources.
Title: Re: Requête get et this. sur arduino
Post by: renaudyes on Aug 23, 2013, 10:47 am
Ok,
mais alors, pourquoi cette ligne me ressort une erreur ?
Code: [Select]
void NomDeLaClass :: setSensor(const OneWire &capteur)
{
  _wire = capteur;
}


erreur : error: invalid use of member (did you forget the '&' ?)
Je ne la comprend pas
Title: Re: Requête get et this. sur arduino
Post by: XavierMiller on Aug 23, 2013, 11:01 am
Sans le contexte, je ne peux rien dire. Donne le code complet, stp.
Title: Re: Requête get et this. sur arduino
Post by: renaudyes on Aug 23, 2013, 11:14 am
Voici les codes :

#include "NomDeLaClass.h"
#include <OneWire.h>

NomDeLaClass::NomDeLaClass(int pin )
{

}
void NomDeLaClass :: setName(String &newName)
{
  _name = newName;
}
void NomDeLaClass :: setSensor(const OneWire &capteur)
{
  _wire = capteur;
}



#ifndef NOM_DE_LA_CLASS_HEADER
#define NOM_DE_LA_CLASS_HEADER      //Evite les inclusions multiples
#include <OneWire.h>
#include "Arduino.h"

class NomDeLaClass
{
   private:
   String _name;
   OneWire _wire();
    //Méthodes et variables privées

   public:
    NomDeLaClass(int pin); 
    void setName(String &newName);
    void setSensor ( const OneWire &capteur);
    //Constructeur de la class
    //Méthodes et variables public

};

#endif
Title: Re: Requête get et this. sur arduino
Post by: XavierMiller on Aug 23, 2013, 11:15 am
_wire() est déclaré comme une fonction retournant un OneWire. Enlève les parenthèses.
Title: Re: Requête get et this. sur arduino
Post by: renaudyes on Aug 23, 2013, 11:31 am
Salut,
C'est ce que je m'étais dit, mais si j'enlève les parenthèses j'ai encore une erreur  :smiley-roll: ... que j'avais "corrigé" en mettant des parenthèses :p


Code: [Select]
NomDeLaClass.cpp: In constructor 'NomDeLaClass::NomDeLaClass()':
NomDeLaClass.cpp:4: error: no matching function for call to 'OneWire::OneWire()'
C:\Users\User\Documents\Arduino\libraries\OneWire/OneWire.h:127: note: candidates are: OneWire::OneWire(uint8_t)
C:\Users\User\Documents\Arduino\libraries\OneWire/OneWire.h:113: note:                 OneWire::OneWire(const OneWire&)
Title: Re: Requête get et this. sur arduino
Post by: XavierMiller on Aug 23, 2013, 11:33 am
L'objet de type OneWire que tu instancies dans ta classe doit être initialisé avec une valeur, tu ne peux pas l'initialiser par défaut.

Tu dois donc prévoir d'initialiser ton _wire dans le constructeur de ta classe.
Title: Re: Requête get et this. sur arduino
Post by: fdufnews on Aug 23, 2013, 02:20 pm
J'avais fait une réponse ce matin qui c'est perdue bizarre.
Je disais que tu ferais mieux de créer une classe dérivée qui hérite de OneWire. Ainsi les objets créés posséderaient toutes les méthodes de OneWire auxquelles s'ajouteraient les getters et les setters ainsi que les propriétés (name par exemple) que tu veux ajouter.