2010-02-26 5 views
0

Je veux allouer statiquement le tableau. Regardez le code suivant, ce code est incorrect, mais il vous donnera une idée de ce que je veux faireproblème d'allocation de tableau statique!

class array 
{ 
    const int arraysize; 
    int array[arraysize];//i want to statically allocate the array as we can do it by non type parameters of templates 
public: 
    array(); 
}; 

array::array():arraysize(10) 
{ 
    for(int i=0;i<10;i++) 
    array[i]=i; 
} 

main() 
{ 
    array object; 
} 
+0

Zia, vous devez indenter votre code. C'est très difficile à lire comme ça. –

+0

Vous n'avez pas posé de question. Veuillez poser une question à laquelle nous pouvons essayer de répondre. – abelenky

+0

Serait-ce que vous voulez une classe avec une taille de temps de compilation fixe? Dans ce cas, templates est le mot clé que vous recherchez. –

Répondre

2

Si la taille de votre tableau est toujours la même, faites-en un membre statique. Les membres statiques qui sont des types entiers peuvent être initialisés directement dans la définition de la classe, comme ceci:

class array 
{ 
    static const int arraysize = 10; 
    int array[arraysize]; 

    public: 
    array(); 
}; 

Cela devrait fonctionner comme vous le souhaitez. Si arraysize n'est pas toujours identique pour chaque objet de type array, vous ne pouvez pas le faire et vous devrez utiliser des paramètres de modèle, allouer dynamiquement le tableau ou utiliser une classe de conteneur STL (par exemple, std::vector).

0

C++ ne permet pas de tableaux de longueur variable (par exemple ceux dont la taille ne sont pas constantes de compilation). En autoriser un dans une structure rendrait impossible le calcul de sizeof (array), car la taille pourrait différer d'une instance à l'autre.

Envisagez d'utiliser std :: vector à la place, si la taille n'est connue qu'au moment de l'exécution. Cela évite également de stocker la taille du tableau dans une variable séparée. Notez que l'allocation de tas (par exemple par std :: vector) autorise également des tableaux plus grands, car l'espace de pile disponible est très limité.

Si vous voulez une constante de compilation, prenez un paramètre de modèle. Ensuite, vous devriez chercher Boost.Array, qui l'implémente déjà.

0

La taille du tableau doit être une constante de temps de compilation. Vous êtes presque là, vous avez juste besoin d'initialiser le const et en faire un static ainsi. Ou, utilisez un tableau dynamique ou un vecteur.

2

Cela doit être fait en utilisant les paramètres du modèle, sinon sizeof(array) serait différent pour chaque objet.

Voici comment vous le feriez en utilisant les paramètres du modèle.

template <int N> 
class array 
{ 
    int data[N]; 

    // ... 
}; 

Ou, vous pouvez utiliser un std::vector si vous ne me dérange pas l'allocation dynamique.

0

EDIT: noter à propos de cette réponse: C'est probablement la mauvaise façon de le faire pour votre situation. Mais si vous vraiment besoin d'être un tableau (pas un vecteur ou autre) et vous vraiment besoin d'être alloué dynamiquement, procédez comme suit:

class array 
{ 
    int *p_array; 

    public: 
    array(int size); 
}; 

array::array(int size) 
{ 
p_array = malloc(size * sizeof(int)); 
} 

Assurez-vous nettoyer (IE libre p_array dans votre descructor)