Déclarer tableau en-tête C++ et de la définir dans un fichier cpp?
C'est probablement une chose très simple, mais je suis novice en C++ donc besoin d'aide.
Je veux juste déclarer un tableau dans mon C++ fichier d'en-tête comme:
int lettersArr[26];
et ensuite définir une fonction dans le fichier cpp comme:
lettersArr[26] = { letA, letB, letC, letD, letE, letF, letG, letH,
letI, letJ, letK, letL, letM, letN, letO, letP, letQ, letR, letS,
letT, letU, letV, letW, letX, letY, letZ };
mais cela ne fonctionne pas.
J'ai obtenu la syntaxe mauvais ou quelque chose? Quelle est la façon correcte à cette question?
Merci beaucoup.
Vous devez vous connecter pour publier un commentaire.
Ajouter
extern
à la déclaration dans le fichier d'en-tête.(Aussi, sauf si vous prévoyez de modifier le tableau, on peut aussi ajouter
const
.)La définition doit avoir un type. Ajouter
int
(ouconst int
):extern
à la définition de la classe et puis l'initialiser dans le constructeur.Letters
objet de sa propre variablelettersArr
, puis le remettre comme il était, et de fixer les constructeurs de classe deLetters
pour initialiser le tableau. Si vous souhaitez que tous lesLetters
objets de partager une seulelettersArr
tableau, faire unstatic
membre.=
pour affecter un tableau à l'intérieur d'un constructeur. Au lieu de cela, vous pourriezstd::copy
de certains autresconst int array[26]
.En-tête:
Source à l'étendue globale:
ou si vous voulez vraiment faire dans une fonction:
Source étendue globale:
Source:
Changer ce que vous avez dans l'en-tête:
afin qu'elle devienne une déclaration, pas une définition.
D'autres ont décrit comment l'initialisation de tableau peut être déplacé vers un fichier de mise en oeuvre, ce qui n'est pas exactement répondre à votre question, mais c'est une solution de contournement qui est utile à savoir.
Si vous voulez vraiment avoir la matrice de tous dans votre fichier d'en-tête, y compris l'initialisation dans votre fichier d'en-tête, alors vous pouvez
donner liaison interne en utilisant
static
, ouutiliser un statique locale dans une fonction inline (qui soutient efficacement liaison externe), ou
utiliser un peu de modèle de truc (prend également en charge une liaison externe).
Les deux dernières solutions sont des solutions de contournement pour le manque de "
inline
" données en C++. Qui est, la capacité de définir le même espace de noms d'objet de l'étendue dans plus d'une unité de traduction. Vous avez que pour les fonctions, viainline
, mais malheureusement pas pour les objets: sans employant une solution de contournement que l'éditeur de liens juste pour dénoncer les multiples définitions.Liaison interne
Ce n'est généralement pas une bonne solution. Il crée un tableau dans chaque unité de traduction où l'en-tête est inclus. Mais il est préférable pour les relativement petites
const
objets, car c'est si simple:Locale statique en fonction inline
C'est probablement la généralement de la "meilleure" solution, à utiliser quand il n'y a pas de raison impérieuse pour sélectionner l'une des autres solutions. Une bonne chose est qu'il est facile de fournir des dynamiques de l'initialisation. Ici, j'ai simplement supposé que vous n'aurez jamais stocker 0 dans le tableau (ajoutent de la logique de la vérification si cette hypothèse ne tient pas):
Modèle astuce
Le modèle astuce fonctionne parce que la norme de ODR, Une Définition de la Règle, fait une exemption spéciale pour les modèles:
Cheers & hth.,
Vous pouvez le faire de cette façon:
dans l'en-tête
dans .rpc
Voici un extrait de l'un de mes fichiers d'en-tête (la mise en œuvre .fichier cpp accède au tableau):
(Utiliser mannequin::les messages à l'extérieur de la maquette de l'espace de noms pour accéder au tableau.)
essayer: