Go Down

Topic: Requête get et this. sur arduino (Read 3686 times) previous topic - next topic

renaudyes

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 ?

fdufnews

#1
Aug 22, 2013, 09:58 pm Last Edit: Aug 22, 2013, 10:01 pm by fdufnews Reason: 1
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
ou là: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

XavierMiller

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.

renaudyes

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;
}

XavierMiller

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++.

renaudyes

#5
Aug 23, 2013, 10:09 am Last Edit: Aug 23, 2013, 10:12 am by renaudyes Reason: 1
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 !

XavierMiller

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.

renaudyes

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

XavierMiller

Sans le contexte, je ne peux rien dire. Donne le code complet, stp.

renaudyes

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

XavierMiller

#10
Aug 23, 2013, 11:15 am Last Edit: Aug 23, 2013, 11:24 am by XavierMiller Reason: 1
_wire() est déclaré comme une fonction retournant un OneWire. Enlève les parenthèses.

renaudyes

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&)

XavierMiller

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.

fdufnews

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.

Go Up