2010-05-10 11 views
0

Je n'ai pas codé en C++ depuis longtemps. Et récemment, j'essaie de travailler sur quelque chose impliquant des structures. Puis, en boucle, j'essaie de créer de nouvelles structures et de leur placer des pointeurs dans une liste.une façon plus agréable de créer des structures dans une boucle

Point* p; 
int i, j; 
while (condition){ 
    // compute values for i and j with some function... 
    p = new Point; 
    p* = {i, j}; //initialize my struct. 
    list.append(p); //append this pointer to my list. 
} 

Maintenant, ma question est-il possible de simplifier cela? Je veux dire, le pointeur variable * p en dehors de la boucle et appelant p = new Point à l'intérieur de la boucle. N'y a-t-il pas une meilleure syntaxe?

Répondre

10

Bien sûr:

Point * p = new Point; 

Vous devriez probablement aussi donner votre classe Point un constructeur:

struct Point {  // note no need for typedef 
    int x; 
    int y; 
    Point(int ax, int ay) : x(ax), y(ay) {} 
}; 

afin que vous puissiez dire:

Point * p = new Point(i, j); 

Vous pouvez également faire votre liste une liste de valeurs de point, plutôt que des pointeurs, auquel cas vous pouvez éviter d'utiliser l'allocation dynamique avec ne w - toujours quelque chose à éviter dans la mesure du possible en C++.

+1

Oh! Merci, Niel! Alors, qui réservera le nouveau p chaque fois à l'intérieur de la boucle? (désolé si cela semble idiot, je fais principalement C tout le temps) – sandra

+1

ATTENDRE! Je peux ajouter une méthode à une structure ?! Hou la la! Merci! – sandra

+0

@sandra C est exactement le même à cet égard. Il est préférable de penser que les pages sont recréées à chaque fois dans la boucle. Et les structures et les classes sont fondamentalement la même chose en C++. –

2

Comme struct sont des classes avec des membres du public par défaut, vous pouvez même créer un constructeur dans le struct et initialiser votre objet point dans la boucle comme ceci:

Point* p = new Point(i,j); 
+0

Merci @Simon, le constructeur de la solution @ Niel est-il nécessaire? – sandra

+0

Oui bien sûr. Vous devez déclarer explicitement le constructeur, ce ne sera pas fait automatiquement. – Simon

+0

Merci, Simon! En fait, c'est ce que j'ai découvert en commentant le constructeur! :) – sandra

5

Le struct peut avoir un constructeur comme:

struct Point{ 
    Point(int ax, int ay):x(ax), y(ay){} 
    int x; 
    int y; 
}; 

et la fonction peut ressembler à:

int i, j; 
while (condition) 
{ 
    list.append(new Point(i,j)); 
} 
+0

Merci @Akanksh! :) – sandra

1

Je dirais qu'il est extrêmement improbable que vous ayez vraiment besoin d'allouer dynamiquement quelque chose comme un point.

Très probablement, vous voulez ajouter un constructeur et les stocker en valeur:

list<Point> list; 
list.append(Point(x, y)); 
0

Je recommande l'approche Factory. En supposant que "Point" sera la classe de base de nombreux objets, vous pouvez avoir une "Usine" qui retournerait des pointeurs.

Ex:

struct Point 
{ 
     Point(int mx, int my):x(mx),y(my) {} 
     int x; 
     int y; 
}; 

// Circle, Polygon, etc. 

class Factory 
{ 
public: 
     static Point *getPoint(int mx, int my) { return new Point(mx, my); } 
// Circle, Polygon, etc 
}; 

Puis, dans un endroit de code:

while(cond) 
{ 
list.append(Factory::getPoint(i, j)); 
} 
+0

Pourquoi supposeriez-vous que Point est une classe de base? Si c'était le cas, ça s'appellerait Shape, n'est-ce pas? C'est ridiculement sur-machiné. –