0
votes

Impossible de créer un tableau alloué par pile dans une classe avec une taille de variable constante

Pourquoi ce code ne se compile-t-il pas?

class MyClass
{
    const int size = 5;
    int arr[size];
};

L'erreur indique que size est un identifiant non déclaré.


1 commentaires

Mieux: class MyClass {std :: array arr; };


3 Réponses :


-2
votes

C'est parce que size n'est pas statique, et que vous essayez d'accéder à cette constante "statiquement" (sans objet, c'est-à-dire).


3 commentaires

Que signifie accéder statiquement à une constante?


cela signifie que vous essayez d'accéder à un membre sans instance d'objet de cette classe.


sans instance d'objet, il n'y a pas non plus de arr



6
votes

Un initialiseur membre par défaut (le = 5; dans votre code) Spécifie uniquement la manière dont l'élément de données non statique est initialisé par défaut . Un constructeur pourrait lui donner une valeur différente. En tant que tel, le compilateur ne peut pas savoir quelle sa valeur sera à l'heure de la compilation.

Et donc, vous ne pouvez pas utiliser a :: Taille dans une expression constante de la compilation. Comme lorsque vous déclarez la taille d'une array.

Si vous avez l'intention de chaque a d'avoir une taille de 5, la variable doit être un membre consexpr statique . Ou comme suggéré dans un commentaire, un std :: Array <..., 5> .


0 commentaires

4
votes

Vous avez besoin d'une expression constante pour la taille lorsque vous déclarez un tableau.

Rendre la taille statique résoudrait votre problème

template <std::size_t N>
class MyClass
{
    std::array<int, N> arr;
};

En général, vous préférez plutôt std :: array car la taille est fixe. Vous pouvez éventuellement inclure la taille comme paramètre de modèle.

class MyClass
{
    const static int size = 5;
    int arr[size];
};


0 commentaires