web-dev-qa-db-fra.com

Comment déclarez-vous des tableaux dans un en-tête C ++?

Ceci est lié à d'autres questions, telles que: - this et certaines de mes autres questions.

Dans cette question , et d'autres, nous voyons que nous pouvons déclarer et initialiser des tableaux de chaîne dans une belle étape, par exemple:

const char* const list[] = {"Zip", "zam", "bam"}; //from other question

Cela peut être fait dans la mise en œuvre d'une fonction sans embauche, ni dans le corps d'un fichier .CPP, en dehors de toute portée.

Ce que je veux faire, c'est avoir un tableau comme celui-ci comme membre d'une classe que j'utilise, quelque chose comme ceci:

class DataProvider : public SomethingElse
{
    const char* const mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"};

public:
    DataProvider();
    ~DataProvider();

    char* GetData()
    {
        int index = GetCurrentIndex(); //work out the index based on some other data
        return mStringData[index]; //error checking and what have you omitted
    }

};

Mais, le compilateur se plaint et je n'arrive pas à déterminer pourquoi. Est-il possible de déclarer et d'initialiser un tableau comme celui-ci en une étape dans une définition de classe? Y a-t-il des alternatives qui sont meilleures?

22
xan

Utilisez l'initialisation statique et externe du mot-clé pour rendre le tableau un membre statique de la classe:

Dans le fichier d'en-tête:

class DataProvider : public SomethingElse
{
    static const char* const mStringData[];

public:
    DataProvider();
    ~DataProvider();

    const char* const GetData()
    {
        int index = GetCurrentIndex(); //work out the index based on some other data
        return mStringData[index]; //error checking and what have you omitted
    }

};

Dans le fichier .CPP:

const char* const DataProvider::mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"};
18
Stefan Rådström

Ceci n'est pas possible en C++. Vous ne pouvez pas initialiser directement le tableau. Au lieu de cela, vous devez lui donner la taille qu'il aura (4 dans votre cas) et vous devez initialiser le tableau dans le constructeur de DataProvider:

class DataProvider {
    enum { SIZEOF_VALUES = 4 };
    const char * values[SIZEOF_VALUES];

    public:
    DataProvider() {
        const char * const v[SIZEOF_VALUES] = { 
            "one", "two", "three", "four" 
        };
        std::copy(v, v + SIZEOF_VALUES, values);
    }
};

Notez que vous devez abandonner la const-ness des pointeurs de la matrice, car vous ne pouvez pas initialiser directement le tableau. Mais vous devez définir plus tard les pointeurs sur les bonnes valeurs et que les pointeurs doivent donc être modifiables.

Si vos valeurs dans le tableau sont néanmoins constituées, le seul moyen est d'utiliser une matrice statique:

/* in the header file */
class DataProvider {
    enum { SIZEOF_VALUES = 4 };
    static const char * const values[SIZEOF_VALUES];
};

/* in cpp file: */

const char * const DataProvider::values[SIZEOF_VALUES] = 
    { "one", "two", "three", "four" };

Avoir la matrice statique signifie que tous les objets partageront ce tableau. Ainsi, vous aurez aussi sauvé la mémoire.

3

La raison pour laquelle vous ne pouvez pas déclarer votre tableau comme ça (Cons-Char * []) ​​est que:

  • vous ne pouvez pas avoir d'initialisateurs dans la déclaration de classe, et ainsi
  • la syntaxe const char* [] n'indique pas la quantité d'espace que le compilateur doit allouer pour chaque instance (votre tableau est déclaré comme une variable d'instance).

En outre, vous voulez probablement faire de cette matrice statique, car c'est en substance une valeur constante.

3
Carl Seleborg