Comment déclarer des tableaux dans un en-tête c++?
Ceci est lié à d'autres questions, telles que: cette, et certains de mes autres questions.
Dans cette question, et d'autres, nous voyons que nous pouvons déclarer et initialiser les 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 de-pas la peine, ou dans le corps d'une .fichier cpp, en dehors de toute portée.
Ce que je veux faire est d'avoir un tableau comme ceci que comme membre d'une classe, je suis en utilisant, 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 à savoir pourquoi. Est-il possible de déclarer et initialiser un tableau comme ceci dans une étape dans la définition d'une classe? Existe-il des alternatives qui sont mieux?
- "implémentation" devrait être orthographié "mise en œuvre"
Vous devez vous connecter pour publier un commentaire.
Utilisez le mot-clé static et externe de l'initialisation de faire le tableau d'un membre statique de la classe:
Dans le fichier d'en-tête:
Dans le .fichier cpp:
La raison pour laquelle vous ne pouvez pas déclarer votre tableau comme ça (const char* []) est que:
const char* []
ne prend pas en état de combien d'espace le compilateur a besoin d'allouer pour chaque instance (votre tableau est déclaré comme variable d'instance).En outre, vous voudrez probablement faire ce tableau statique, car il est, par essence, une valeur constante.
const char* []
t de l'état de combien d'espace le compilateur a besoin d'allouer pour chaque instance - un pointeur vers la mémoire. C'est vraiment pourquoi tableau statique de la déclaration n'est pas autorisé pour les non-statique des variables; chaque nouvelle instance nécessite davantage de mémoire de l'allocation, et ce genre de traitement est traditionnellement traitée explicitement dans les constructeurs.Ce n'est pas possible en C++. Vous ne pouvez pas directement initialiser le tableau. Au lieu de cela vous avez à lui donner la dimension qu'il aura (4 dans votre cas), et vous devez l'initialiser dans le constructeur de DataProvider:
Noter que vous devez renoncer à la const-ness de pointeurs dans le tableau, puisque vous ne pouvez pas directement initialiser le tableau. Mais vous devez plus tard, les pointeurs vers la droite des valeurs, et donc les pointeurs doivent être modifiables.
Si vos valeurs dans le tableau sont const néanmoins, le seul moyen est d'utiliser un tableau statique:
Avoir le tableau statique signifie que tous les objets partageront ce tableau. Ainsi, vous aurez sauvé la mémoire trop.