initialiser un const tableau dans une classe d'initialiseur en C++
J'ai la classe suivante en C++:
class a {
const int b[2];
//other stuff follows
//and here's the constructor
a(void);
}
La question est, comment puis-je initialiser b dans la liste d'initialisation, étant donné que je ne peux pas l'initialiser à l'intérieur du corps de la fonction du constructeur, car b est const
?
Cela ne fonctionne pas:
a::a(void) :
b([2,3])
{
//other initialization stuff
}
Edit: le cas de Le dire c'est quand je peux avoir des valeurs différentes pour b
pour différentes instances, mais les valeurs sont connus pour être constante pendant toute la durée de l'instance.
Vous devez vous connecter pour publier un commentaire.
Comme les autres ont dit, ISO C++ ne prend pas en charge que. Mais vous pouvez le contourner. Suffit d'utiliser std::vector à la place.
std::array
à éviter certains des généraux.Avec C++11 la réponse à cette question a maintenant changé et vous pouvez en fait faire:
Il n'est pas possible dans la norme actuelle. Je crois que vous serez en mesure de le faire en C++0x à l'aide d'initialiseur de listes (voir Un Bref coup d'Oeil sur le C++0x, par Bjarne Stroustrup, pour plus d'informations sur l'initialiseur de listes et d'autres de nice C++0x caractéristiques).
std::vector
utilise le tas. Waow, quel gâchis ce serait juste pour le plaisir d'unconst
la santé mentale-case. Le point destd::vector
est une dynamique de croissance au moment de l'exécution, et non pas un vieux de la vérification de syntaxe qui doit être fait au moment de la compilation. Si vous n'allez pas à grandir alors créer une classe pour envelopper un tableau normal.ConstFixedSizeArrayFiller
etConstFixedSizeArray
sont réutilisables.La première permet d'exécution de la vérification de limites lors de l'initialisation de la matrice (même comme un vector), qui peut par la suite devenir
const
après cette initialisation.Le second permet la matrice soit alloué à l'intérieur de un autre objet, qui pourrait être sur le tas ou tout simplement la pile si c'est l'emplacement de l'objet. Il n'y a pas de perte de temps de l'allocation dans le tas. Il effectue également au moment de la compilation const vérifier sur le tableau.
b_filler
est un petit cours privé pour fournir les valeurs d'initialisation. La taille de la matrice est vérifié au moment de la compilation avec les arguments de modèle, donc il n'y a aucune chance de sortir des limites du terrain.Je suis sûr qu'il y a de plus exotique des moyens de modifier cette. C'est un premier coup de couteau. Je pense que vous pouvez très bien faire pour tout le compilateur de la lacune de classes.
new
est trop, et encore plus si vous savez au moment de la compilation combien vous avez besoin. Par exemple, certaines implémentations de std::vector ne allouer ses éléments dans une mémoire tampon interne, au lieu d'utilisernew
, en effectuant de petits vecteurs assez bon marché pour construire/détruire.std::vector
et les tableaux de rendement exactement le même code. Geez.Norme ISO C++ ne pas vous laisser faire cela. Si il l'a fait, la syntaxe serait probablement:
Ou quelque chose le long de ces lignes. À partir de votre question, il sonne comme ce que vous voulez est une constante de la classe (aka statique) membre de la matrice. C++ ne permettent de le faire. Comme:
De la sortie:
Maintenant, bien sûr, puisque c'est un membre de classe statique, il est le même pour chaque instance de la classe A. Si ce n'est pas ce que vous voulez, c'est à dire que vous souhaitez que chaque instance d'Un avoir différentes valeurs d'élément dans le tableau a, puis vous faites l'erreur d'essayer de faire le tableau const pour commencer. Vous devez simplement faire ceci:
Où j'ai une constante tableau, il a toujours été fait comme statique. Si vous pouvez accepter que, ce code doit être compilé et exécuté.
Vous ne pouvez pas le faire à partir de la liste d'initialisation,
Ont un coup d'oeil à ceci:
http://www.cprogramming.com/tutorial/initialization-lists-c++.html
🙂
Une solution sans utiliser le tas avec
std::vector
est d'utiliserboost::array
, si vous ne pouvez pas initialiser les membres du groupe directement dans le constructeur.Comment au sujet de l'émulation d'un const tableau via un accesseur de la fonction? C'est non statique (comme vous l'avez demandé), et il ne nécessite pas de stl ou toute autre bibliothèque:
Parce que::privateB est privé, il est effectivement constante à l'extérieur d'un::, et vous pouvez y accéder similaire à un tableau, par exemple
Si vous êtes prêt à utiliser une paire de classes, vous pouvez en plus de protéger privateB de fonctions membres. Cela pourrait être fait par hérite d'un; mais je crois que je préfère John Harrison comp.lang.c++ post à l'aide d'un const classe.
il est intéressant de noter, en C# vous avez le mot-clé const, qui se traduit par C++static const, par opposition à la lecture seule qui ne peut être que définie à des constructeurs et des initialisations, même par les non-constantes, ex:
Je suis d'accord, si vous avez un const pré-définis ensemble que vous pourriez faire ainsi de l'électricité statique.
À ce stade, vous pouvez utiliser cette intéressante syntaxe:
cependant, je n'ai pas trouvé un moyen de contourner la constante '10'. La raison en est claire, il a besoin d'elle pour savoir comment faire accéder à la matrice. Une alternative possible est d'utiliser des #define, mais je n'aime pas cette méthode et j' #undef à la fin de l'en-tête, avec un commentaire à modifier il y a au RPC et dans le cas où si un changement.