[résolu] [c++] tableau de constantes dans class

Bonjour,

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

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 ?

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 :

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 :

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 :

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.

zoroastre:
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 :slight_smile: la partie qui me pose problème.

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

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

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.

Dans ta déclaration ".h" met ceci

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

En dehors de ta classe ou dans ton .cpp

 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.

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

Parfait, merci à vous tous de votre aide !

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

Que sont les accesseurs ?

churchill:
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 :grin: )

osaka:
(Mettre un attribut static et constant en private est un peux un non sens :grin: )

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 :slight_smile:

churchill:
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.

churchill:
pfff... vivement l'arduino programmable en python :slight_smile:

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

churchill:
pfff... vivement l'arduino programmable en python :slight_smile:

osaka:
Ç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 :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