2010-04-02 6 views
3

J'ai une classe définie comme:Comment définir un tableau statique sans une taille de contant dans un constructeur d'une classe? (C++)

class Obj { 
public: 
    int width, height; 
    Obj(int w, int h); 
} 

et je besoin de contenir un tableau statique comme ceci:

int presc[width][height]; 

cependant, je ne peux pas définir à l'intérieur de la classe, de sorte qu'il ne possible de créer un pointeur vers un tableau 2D (et, par curiosité, 3, 4 et tableaux 5D), ont en tant que membre de la classe, et intitalize dans le constructeur comme:

int ar[5][6]; 
Obj o(5, 6, &ar); 

EDIT: L'idée ici est que chaque objet aura une largeur et une hauteur différentes, donc le tableau que j'utilise pour représenter cet objet sera unique à l'objet, mais une fois que ce tableau est défini (de préférence dans le constructeur), il ne changera pas . Et les valeurs de largeur et de hauteur pour un objet particulier sont connues au moment de la compilation.

EDIT: Les tableaux sont pour la détection de collision en superposant les presc tableaux de deux objets sur un grand tableau, et de voir où le chevauchement, des déclarations comme ceci:

Obj player1(32, 32); //player with a width of 32 px and height of 32 px, presc[32][32] 
Obj boss(500, 500); //boss with a width of 500 px and height of 500 px, presc[500][500] 
+0

Est-ce que tous les objets Obj auront une largeur et une hauteur constantes? – jpalecek

+0

Une fois la largeur et la hauteur définies, elles ne seront pas modifiées, mais chaque objet aura une largeur et une hauteur différentes. –

+0

Pouvez-vous nous montrer l'utilisation? Comment obtenez-vous les tailles de tableau au moment de la compilation? – GManNickG

Répondre

2

Si, par « dynamique », vous signifie "tas-alloués", alors non, il n'y a aucun moyen de cela avec l'objectif actuel. OTOH, si vous connaissez w et h au moment de la compilation:

template <int W, int H> 
class Obj { 
public: 
    // ... 
private: 
    int presc[W][H]; 
} 
+2

C'est le même que le code original, juste habillé dans des modèles. S'il connaissait w et h au moment de la compilation, son code d'origine pourrait utiliser ce que vous substituez aux paramètres du template. – Ben

+0

En fait w/width et h/height sont connus au moment de la compilation (excuses si je n'étais pas clair au début). L'idée est que je connaîtrai les valeurs h et w pour un objet particulier au moment de la compilation, elles ne seront tout simplement pas les mêmes pour tous les objets, et donc je dois utiliser des variables pour la taille. –

+0

@Ben, qu'est-ce qui ne va pas avec une réponse correcte qui n'a pas eu lieu à l'OP? –

4

Non, la taille de la classe doit être connue au moment de la compilation. Si vous ne connaissez pas la taille de la matrice avant l'exécution, vous ne pouvez pas avoir cette matrice en tant que membre de la classe (vous devez allouer dynamiquement la matrice et y stocker un pointeur dans la classe ou de préférence, utiliser un std::vector).

+0

Je connais la taille du tableau au moment de la compilation, il ne sera pas le même pour tous les objets, donc je ne peux pas utiliser une variable constante. –

+0

@ Keand64: Dans ce cas, vous avez la possibilité d'utiliser un modèle pour définir la largeur et la hauteur au moment de la compilation, comme Marcelo le démontre dans sa réponse. Le coût de cela est que les objets avec différentes dimensions de tableau ont des types différents. Vous pouvez peut-être contourner cela en utilisant l'héritage, mais cela peut devenir salissant. –

0

boost::array et std::tr1::array fournissent tous deux des tableaux de taille constante. Comprenez que cela crée de nouveaux types entiers; ne pas utiliser un tableau dynamique rendra probablement votre code plus difficile à écrire que nécessaire. Vous devrez paramétrer votre classe, ainsi que toutes les fonctions qui fonctionnent sur ces objets. Et tout ce que vous économiserez est une allocation de tas unique.

Questions connexes