2010-03-28 2 views
4

Alternative 1, réutiliser une variable temporaire:mode préféré de remplissage d'un vecteur C++ de structs

Sticker sticker; 
sticker.x = x + foreground.x; 
sticker.y = foreground.y; 
sticker.width = foreground.width; 
sticker.height = foreground.height; 
board.push_back(sticker); 

sticker.x = x + outline.x; 
sticker.y = outline.y; 
sticker.width = outline.width; 
sticker.height = outline.height; 
board.push_back(sticker); 

Alternative 2, la portée de la variable temporaire:

{ 
Sticker sticker; 
sticker.x = x + foreground.x; 
sticker.y = foreground.y; 
sticker.width = foreground.width; 
sticker.height = foreground.height; 
board.push_back(sticker); 
} 

{ 
Sticker sticker; 
sticker.x = x + outline.x; 
sticker.y = outline.y; 
sticker.width = outline.width; 
sticker.height = outline.height; 
board.push_back(sticker); 
} 

Alternative 3, écrire directement à la mémoire vectorielle:

{ 
board.push_back(Sticker()); 
Sticker &sticker = board.back(); 
sticker.x = x + foreground.x; 
sticker.y = foreground.y; 
sticker.width = foreground.width; 
sticker.height = foreground.height; 
} 

{ 
board.push_back(Sticker()); 
Sticker &sticker = board.back(); 
sticker.x = x + outline.x; 
sticker.y = outline.y; 
sticker.width = outline.width; 
sticker.height = outline.height; 
} 

Quelle approche préférez-vous?

Edit: Pour des raisons de cette discussion, on suppose que les missions doivent être effectuées par un à l'extérieur d'un constructeur

Répondre

16

option Mon - donner un autocollant constructeur qui prend les paramètres. puis:

board.push_back(Sticker(outline.x, foo.bar, etc.)); 

Edit: code pour illustrer les noms des paramètres constructeur:

#include <iostream> 
using namespace std; 

struct S { 
    int a, b; 
    S(int a, int b) : a(a), b(b) { 
    } 
}; 

int main() {  
    S s(1, 2); 
    cout << s.a << " " << s.b << endl; 
} 
+0

Ma suggestion, mais je préfère 'board.push_back (autocollant (contour, x)); board.push_back (Sticker (premier plan, x)) 'plutôt que de passer chaque pièce une par une. –

+0

Ya, ajouter une liste init à l'intérieur et voila ' – Maciek

+0

Comment appelleriez-vous vos paramètres constructeur, car ils devraient idéalement avoir les mêmes noms que les membres de la classe? – henle

0

1. Alternative Pourquoi créer un champ juste pour une variable? Il y a généralement une portée englobante à proximité (au minimum, vous devriez garder vos fonctions/procédures de petite taille afin de pouvoir le définir).

Pourquoi? Vous pouvez créer un nom de variable plus court, par ex. st dans ce cas. Puisque l'affectation sera à proximité, il ne devrait pas y avoir de perte de clarté. En fait, il semblera plus simple et plus propre.

En outre, si le vecteur doit être déréférencé/accessible à partir de plusieurs autres niveaux d'indirection, il simplifiera également le code.

+0

Vraiment? Cela ne me dérange pas tellement la verbosité. En ce qui concerne la portée: je pense qu'il serait plus facile pour un compilateur d'optimiser l'éloignement temporaire s'il écrit dans une nouvelle variable. – henle

+1

@henle Ne vous souciez pas du compilateur. Ce sont des logiciels très avancés (il suffit de penser à la durée de vie du C++) et ils peuvent trouver beaucoup de choses.La portée est pour vous afin que vous ne fassiez pas d'erreurs. – foraidt

+0

@mxp Je ** fais ** attention au compilateur – henle

2

board.resize (nombre d'autocollants);

itérer Puis, à travers tout le vecteur et les paramètres définis.

0

Que diriez-vous WinForms style:

// Class members 

Sticker sticker1; 
Sticker sticker2; 
Board board; 

// Initialization 

void InitBoard() 
{ 
    sticker1.x = x + foreground.x; 
    sticker1.y = foreground.y; 
    sticker1.width = foreground.width; 
    sticker1.height = foreground.height; 

    sticker2.x = x + outline.x; 
    sticker2.y = outline.y; 
    sticker2.width = outline.width; 
    sticker2.height = outline.height; 

    // Add to board 
    board.push_back(sticker1); 
    board.push_back(sticker2); 
}