Go Down

Topic: [résolu] [c++] tableau de constantes dans class (Read 1 time) previous topic - next topic

churchill

Mar 04, 2012, 09:35 pm Last Edit: Mar 05, 2012, 12:45 am by churchill Reason: 1
Bonjour,

Je souhaite, dans la définition d'une classe, créer un tableau de constantes du genre :
Code: [Select]

enum {SUISSE, FRANCE, ITALIE};

class Minipedia
{
   private:
       static const char * pays[3];
       static unsigned long habitants[3];
       
   public:
       Minipedia(){
           pays[SUISSE]="Suisse";
           pays[FRANCE]="France";
           pays[ITALIE]="Italie";

           habitants[SUISSE]=7825243;
           habitants[FRANCE]=64876618;
           habitants[ITALIE]= 60483521;
       }
       unsigned long population(int idPays){
           return habitants[idPays];
       }
};

Mais ça ne marche pas. Impossible d'initialiser valeurs à mes tableaux statiques.
Est-ce que quelqu'un à une idée ?

zoroastre

#1
Mar 04, 2012, 10:31 pm Last Edit: Mar 04, 2012, 10:35 pm by zoroastre Reason: 1
Yep!

Si c'est pour créer un tableau de constantes, je ne vois pas l'interêt d'utiliser une classe. Une classe est par définition un moule auquel on définit plusieurs attributs. Ainsi, il sera possible de créer plusieurs objets rattachés à cette classe et par le fait, définir leur attributs/caractéristiques.

Exemple d'une classe permettant de dessiner des formes :

Code: [Select]

class Objet {
 public:
   Objet();
   int gadget;
   char *text;
   
   //int _layer;
   int radius;
   
   Objet(int,char*,int,int,int,int);     // type, text, x0, y0, x1, y1

   void draw() {  };

   void disable() {  };
   
   boolean check(int x, int y) {  };
         
 private:
   int x1,y1,x2,y2;
};

Objet::Objet(int g, char *t, int a, int b, int c=0, int d=0) {
 gadget = g;
 text = t;
 x1 = a;
 y1 = b;
 x2 = c;
 y2 = d;
}


J'appelle ainsi les objets et leur donnent leurs caractéristiques :

Code: [Select]

Objet IHM_menu(1, "menu", 165, 190, 300, 230);                              // box
Objet IHM_clock(0, "", 230, 10);                                            // text
etc...


Je peux ensuite modifier leur paramètre à la volée dans mon sketch :

Code: [Select]
IHM_clock.text = update_clock(); IHM_clock.draw();
Dans l'exemple, je modifie l'attribut text de l'objet IHM_clock et j'appelle la fonction draw()

Je précise que mes connaissances en c++ sont toutes relatives...

@+

Zoroastre.
Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message ;)

churchill


Si c'est pour créer un tableau de constantes, je ne vois pas l'interêt d'utiliser une classe (...)


Oui bien sur.
Ce n'était là qu'une partie de la classe :-) la partie qui me pose problème.

zoroastre

#3
Mar 04, 2012, 10:42 pm Last Edit: Mar 04, 2012, 10:57 pm by zoroastre Reason: 1
Yep!

ok  XD

Ta classe est dans une librairie ou dans ton sketch ? Cà nous aiderait de voir l'ensemble.

@+

Zoroastre.

EDIT1 : En regardant ton code à nouveau, ce ne serait pas plus simple de créer un tableau à deux dimensions et de créer une fonction liant les infos ???
Code: [Select]

class Minipedia
{
   private:
       static const char * tableau[3][2] = {
             {Suisse, 7825243},
             {France, 64876618},
             {Italie,  60483521}
};
       
   public:
...



Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message ;)

skywodd

Bonjour,

Tu ne peut pas mettre d'initialisation dans la déclaration de ta classe.
Tu doit déclarer le tableau dans le .h, mais le remplir dans le constructeur de la classe.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

osaka

#5
Mar 04, 2012, 11:24 pm Last Edit: Mar 05, 2012, 12:19 am by osaka Reason: 1
Dans ta déclaration ".h" met ceci
Code: [Select]

class Minipedia
{    
   private:
       static const char * pays[3];
  .
  .
  .


En dehors de ta classe ou dans ton .cpp

Code: [Select]

const char * Minipedia::pays[3] = {"Suisse", "France", "Italie"};


Vu que tu le met en private n'oublie pas de mettre tes accesseurs en static également.

churchill


Dans ta déclaration ".h" met ceci
(...)
En dehors de ta classe ou dans ton .cpp
(...)

Parfait, merci à vous tous de votre aide !


Vu que tu le met en private n'oublie pas de mettre tes accesseurs en static également.

Que sont les accesseurs ?

osaka

#7
Mar 05, 2012, 01:02 am Last Edit: Mar 05, 2012, 01:40 am by osaka Reason: 1

Que sont les accesseurs ?


Les méthodes qui te permettent d'accéder à tes attributs privés en dehors de ta class, appelé getter/setter.
Le getter te retourne la valeur de ton attribut le setter modifie la valeurs de ton attribut.
Conventionnellement on les nommes getNomDeTonAttribut() et setNomDeTonAttribut(), pour ton cas ça serait getPays() setPays()
Enfin vu que ce sont des valeurs constante pas vraiment besoin de setter.
(Mettre un attribut static et constant en private est un peux un non sens  :smiley-mr-green: )

churchill


(Mettre un attribut static et constant en private est un peux un non sens  :smiley-mr-green: )

Private, parce que ce sont des constantes à usage interne de la classe (bon pas dans cet exemple, mais ce n'est qu'un exemple). Puis je pensais (à tort ?) : static pour ne pas que les données soient recopiées avec chaque instances, et constant... par ce que ce sont des constantes.
Bon je débute en c++ comme tu peux le constater.
pfff... vivement l'arduino programmable en python :-)

osaka


Puis je pensais (à tort ?) : static pour ne pas que les données soient recopiées avec chaque instances, et constant... par ce que ce sont des constantes.


Non non tu penses bien et tu ne fais aucune faute,  c'est surtout le fait qu'elle soit statique, constante et privée donc seulement accessible dans ta classe ou ton objet (instance de classe) qui me donne cette impression de non sens.
Maintenant tout dépend de l'utilisation que tu en fais aussi, juste utile en interne à la classe ou utile à l'extérieure également ...
Je ne suis pas spécialiste c++ que je n'ai pratiqué que lors de ma scolarité, j'ai une préférence pour java bien plus stricte et moin permissif niveau programmation objet.


pfff... vivement l'arduino programmable en python :-)


Ça pourrait paraitre bien mais pas adapté à la programmation sur microcontrôleur surtout avec son typage dynamique fort, une vrai catastrophe niveau optimisation.  :~

skywodd


pfff... vivement l'arduino programmable en python :-)


Ça pourrait paraitre bien mais pas adapté à la programmation sur microcontrôleur surtout avec son typage dynamique fort, une vrai catastrophe niveau optimisation.  :~

Ne jamais dire jamais ;)
Les machines virtuelles python sont extrêmement optimisé contrairement à ce que l'on pourrez penser !

http://wiki.python.org/moin/PyMite
http://code.google.com/p/python-on-a-chip/
VM python compatible (à l'heure actuelle) : mega2560, teensy++ 2.0, stm32 et pic32/dsPic
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Go Up