11
votes

Comment instancier un vecteur statique de l'objet?

J'ai une classe A, qui a un vecteur statique d'objets. Les objets sont de classe B xxx

IN instantiatevector () xxx

mais j'ai une erreur de compilation à l'aide de Visual Studio 2008: Symbole externe non résolu ... Est-il possible d'instancier le vecteur statique en utilisant la méthode ci-dessus? Pour que l'objet B soit créé, certaines données doivent être lues à partir du fichier d'entrée et stockées sous forme de variables de membre de B

ou il n'est pas possible et seul vecteur statique simple est possible? J'ai lu quelque part que pour instancier le vecteur statique, vous devez d'abord définir un const int int A [] = {1,2,3}, puis copier un [] en vecteur


0 commentaires

3 Réponses :


4
votes

Ajoutez la définition de l'objet membre statique à votre fichier de mise en œuvre de la classe: xxx

ou plutôt, absorbant et évitant la routine d'initialisation: < Pré> xxx

Remarque: en C ++ 98/03, vector_of_b (5) et vector_of_b (5, b ()) sont identiques. En C ++ 11, ils ne sont pas.


2 commentaires

"En C ++ 11 Ils ne sont pas." En C ++ 11, comment diffèrent-ils?


@Rob: En C ++ 11, l'ancienne valeur initialise les nouveaux éléments, ce dernier direct-les initialise à une copie de B () . En C ++ 98/03, les deux versions ont le deuxième comportement. C'était une supervision de l'ancien standard que l'initialisation de la valeur n'était pas possible, même si cela aurait clairement été possible. Ideme va pour redimension () .



19
votes

Vous devez fournir la définition de vector_of_b code> comme suit:

// default constructs 5 B objects into the vector
vector_of_B.resize(5);


8 commentaires

Pouvez-vous expliquer plus sur votre note latérale? Je crée volontairement des objets statiques de B, car je suppose que sa mémoire sera automatiquement libérée à la fin du programme?


Re les copies supplémentaires: qui se soucie? Le code ne sera exécuté qu'une seule fois.


@Jameskanze dans ce cas particulier, oui. Le code (peut) ne sera exécuté qu'une seule fois, mais si son indique d'autres parties du code, il suffit de souligner.


@Michael Oui Vous créez des objets statiques de B et ils seront supprimés à la fin du programme, mais votre fonction écrite a au moins deux copies de chaque objet B (un pour l'initialisation et une (ou plus) pour l'insert de vecteur).


Oic, alors sera-t-il préférable de déclarer un vecteur de pointeurs à b? Vecteur vector_of_b


Non - voir ma suggestion de (à mon avis) le moyen le plus approprié d'accomplir.


Que diriez-vous de vector_of_b.resize (5); pour obtenir 5 éléments construits par défaut?


@Fredoverflow Great Suggestion, meilleure que mon exemple de réponse.



2
votes

Vous pouvez soit utiliser un assistant statique ou utiliser Boost :: Attribuer

1> Utilisation d'une petite aide: P>

vector<B> A::vector_of_B = boost::assign::list_of(B())(B())(B())(B())(B());


0 commentaires