c++ déclaration de tableau dans un en-tête
Je me demandais si il est possible de déclarer un tableau (de taille non connue à ce moment), en tant que membre privé d'une de la classe et, plus tard, de définir la taille dans le constructeur de la classe. Par exemple:
class Test {
int a[];
public:
Test(int size);
};
Test::Test(int size) {
a[size]; //this is wrong, but what can i do here?
}
Est-ce possible ou dois-je utiliser des tableaux dynamiques? Merci!
OriginalL'auteur | 2008-11-26
Vous devez vous connecter pour publier un commentaire.
Non ce n'est pas possible. Tableau des déclarations dans les en-têtes doivent avoir de la constante de la taille de la valeur. Sinon, c'est impossible pour des constructions comme "sizeof" pour fonctionner correctement. Vous aurez besoin de déclarer le tableau comme un type de pointeur et d'utiliser de nouvelles[] dans le constructeur. Exemple.
Drat. J'ai l'habitude d'appeler d'autres personnes pour le même problème ... Sera corrigé sous peu
Vous avez oublié de corriger les supprimer. Je l'ai fait.
Tout va montrer pourquoi vecteur est une meilleure idée.
Certainement d'accord vecteur est mieux. L'échantillon initial n'a pas l'utilisation de la STL j'ai donc décidé de répondre sans STL. TSL C++ tellement mieux. Je suis la recherche de plus en plus difficile de séparer les deux
OriginalL'auteur
Réponse courte: Non (La taille d'un tableau est défini au moment de la compilation uniquement)
Réponse Longue:
Vous pouvez utiliser un vecteur pour obtenir le même résultat:
Ceux qui haïssent l'amour à la haine, de façon anonyme. Déteste les rageux! Je vous donne un point.
+1 Pour une bonne pratique réponse, si quelqu'un a un problème avec elle d'expliquer pourquoi, afin que nous puissions vous montrer Martin est à droite)
+1 pour moi, std::vector<> est grand. Un mineur pinaille serait d'utiliser un size_t au lieu de int pour le ctor.
Magnusson: Wee repéré. Mis à jour. Mais si votre taille de vecteur est le débordement d'une signée int je pense que vous avez d'autres problèmes.
OriginalL'auteur
Comme d'autres réponses ont souligné, de la taille d'un tableau est fixe au moment de la compilation. Cependant, à l'aide de modèles, vous pouvez paramétrer la taille au moment de la compilation:
Cette technique ne permet pas de calculer la taille à exécuter temps (comme la dynamique
std::vector
solution), mais en fonction de vos besoins, cela peut être suffisant.Non pas que l'on pouvait copier un Test<2> Test<1> en tout cas, il ne rentrait pas. Aussi, pas de polymorphisme - Test<1> Test<2> sont des types incompatibles, de sorte que chaque fonction qui traite doit être basé sur un modèle trop.
pas de soucis. il peut encore modèle de l'opérateur= et la cctor.
Conseil intéressant. Encore une autre raison pourquoi les Génériques != Modèles. Ou est-ce les Génériques < Modèles? 😉
OriginalL'auteur
Tout d'abord, il est généralement préférable d'initialiser les choses dans la liste d'initialisation du constructeur, pas dans le corps du constructeur.
Vous ne pouvez initialiser un tableau avec une prédéfinis liés si vous savez que lié au moment de la compilation. Dans cette situation, vous aurez besoin d'allouer dynamiquement de l'espace.
Vous devez vous rappeler d'avoir un destructeur qui aurait pour effet de supprimer le tableau lorsque l'objet est détruit ou si vous obtenez une fuite de mémoire.
OriginalL'auteur
Voir Martin solution (utilisation
std::vector
), et n'oubliez pas que même si vous devez passer un tampon à une API Cstd::vector
vous permet de le faire en passant&vec[0]
:Il est garanti de fonctionner, mais seulement si le vecteur n'est pas vide (C++ bizarreries, <soupir>).
memset était juste un exemple, mais vous avez raison 🙂
OriginalL'auteur
Non, ce n'est pas possible. Vous devez utiliser un tableau dynamique comme un
std::vector
. C99 permet une struct avoir un sans apprêt tableau comme la dernier membres seulement, mais même lorsque vous faites cela, vous avez encore à allouer manuellement la mémoire vous-même, par exemple avecmalloc()
.OriginalL'auteur
De quoi vous parlez n'est pas possible. Les Classes ont toujours une taille constante. Vous pourriez avoir votre classe l'utilisation d'un pointeur vers un tableau alloué dynamiquement ou vous pouvez utiliser un std::vector.
OriginalL'auteur