Pages: [1]   Go Down
Author Topic: [résolu] [c++] tableau de constantes dans class  (Read 1232 times)
0 Members and 1 Guest are viewing this topic.
Massongex, Suisse
Offline Offline
Full Member
***
Karma: 3
Posts: 169
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je souhaite, dans la définition d'une classe, créer un tableau de constantes du genre :
Code:
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 ?
« Last Edit: March 04, 2012, 06:45:37 pm by churchill » Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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:
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.
« Last Edit: March 04, 2012, 04:35:04 pm by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Massongex, Suisse
Offline Offline
Full Member
***
Karma: 3
Posts: 169
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

ok  smiley-lol

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:
class Minipedia
{
    private:
        static const char * tableau[3][2] = {
              {Suisse, 7825243},
              {France, 64876618},
              {Italie,  60483521}
};
        
    public:
...


« Last Edit: March 04, 2012, 04:57:13 pm by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dans ta déclaration ".h" met ceci
Code:
class Minipedia
{    
    private:
        static const char * pays[3];
   .
   .
   .

En dehors de ta classe ou dans ton .cpp

Code:
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.
« Last Edit: March 04, 2012, 06:19:40 pm by osaka » Logged


Massongex, Suisse
Offline Offline
Full Member
***
Karma: 3
Posts: 169
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 )
« Last Edit: March 04, 2012, 07:40:05 pm by osaka » Logged


Massongex, Suisse
Offline Offline
Full Member
***
Karma: 3
Posts: 169
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

(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 :-)
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-confuse
Logged


France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-confuse
Ne jamais dire jamais smiley-wink
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
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: