2010-11-09 3 views
4

Mon code ressemble à quelque chose dans ce sens.Un constructeur std :: vector appelle-t-il des constructeurs d'objets pour chaque élément?

class A 
{ 
    public: 
    A(int i) { printf("hello %d\n", i); } 
    ~A() { printf("Goodbye\n"); } 
} 


std::vector(10, A(10)); 

Je remarque que bonjour imprime une fois. Il semble impliquer que le vecteur n'alloue de l'espace que pour l'élément mais ne le construit pas. Comment puis-je le faire construire 10 objets A?

+1

très peu de gens désapprouvent en utilisant le style C IO en code C++ (http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.1) – Flexo

+0

c'est seulement un ex amplement OK? – Matt

Répondre

12

L'objet est construit une seule fois, comme vous le passez à std :: vector. Ensuite, cet objet est copié 10 fois. Vous devez faire un printf dans le constructeur de copie pour le voir.

+0

Merci ça l'explique. – Matt

3

A(10) construit un objet temporaire. Juste une fois. Les 10 éléments de votre vecteur sont construits via le constructeur . Donc, si vous définissez un constructeur de copie pour imprimer B, vous obtiendrez 10 B.

1

Define constructeur de copie et vous serez bien:

#include <cstdio> 
#include <vector> 


class A 
{ 
    public: 
     A(int i) { printf("hello %d\n", i); } 
     ~A() { printf("Goodbye\n"); } 
     A(const A&) 
     { 
      printf("copy constructing\n"); 
     } 
}; 


int main() 
{ 
    std::vector<A> a(10, A(5)); 
} 
+1

pourquoi # inclure et mais ne pas les utiliser et ne pas inclure ? – Flexo

+0

@awoodland mauvaise copie et coller –

+1

Si vous "#include ", vous devez utiliser 'std :: printf'. Si vous voulez utiliser printf sans le fichier std ::, utilisez '#include '. – Sjoerd

6

Vous avez oublié le constructeur de copie:

#include <iostream> 
#include <vector> 
using namespace std; 

class A 
{ 
     int i; 
public: 
     A(int d) : i(d) { cout << "create i=" << i << endl; } 
     ~A() { cout << "destroy" << endl; } 
     A(const A& d) : i(d.i) { cout << "copy i=" << d.i << endl; } 
}; 

int main() 
{ 
     vector<A> d(10,A(10)); 
} 

Sortie:

create i=10 
copy i=10 
copy i=10 
copy i=10 
copy i=10 
copy i=10 
copy i=10 
copy i=10 
copy i=10 
copy i=10 
copy i=10 
destroy 
destroy 
destroy 
destroy 
destroy 
destroy 
destroy 
destroy 
destroy 
destroy 
destroy 
Questions connexes