2015-04-28 15 views
7

Diciamo che abbiamo la classe A:vettore di classe senza difetto costruttore

Class A 
{ 
    public: 
     A() = delete; 
     A(const int & y) 
     : x(y) 
     {} 
    private: 
     int x; 
}; 

Come si crea un std::vector di tipo A e dare un argomento al costruttore A s'? Come aggiungerei 3 allo vector?

+0

È chiedere troppo per provare a compilare effettivamente il codice prima di postare? 'Class',' std :: vector ... 'e' std :: vector v (100); 'sono tutte sciocchezze. – Praetorian

risposta

17

Come si crea un std::vector di tipo A e dare un argomento al costruttore A s'?

std::vector<A> v1(10, 42); // 10 elements each with value 42 
std::vector<A> v2{1,2,3,4}; // 4 elements with different values 

Come dovrei aggiungere 3 al vettore?

v.emplace_back(3);   // works with any suitable constructor 
v.push_back(3);    // requires a non-explicit constructor 

La mancanza di un costruttore di default significa solo non si può fare operazioni che hanno bisogno di uno, come

vector<A> v(10); 
v.resize(20); 

entrambi i quali default-costruito inserire elementi nel vettore.

+0

Per aggiungere a questa risposta (e per favore correggimi se ho torto): affinché il primo costruttore possa compilare, deve esistere una conversione implicita da 'int' a 'A' e un operatore di assegnazione. Se uno di questi è assente (che non è il caso nella domanda), non funzionerà. Questo mi ha fatto pensare: perché non esiste un costruttore variadic per inizializzare l'oggetto con più parametri? JorenHeit

+0

@JorenHeit: quasi. Ha bisogno di un costruttore implicito di conversione; senza quello, dovresti dire "A (42)" o "{42}", non solo "42". Richiede anche un costruttore di copia o spostamento (non un operatore di assegnazione), ma questo è un requisito generale per 'vector'. –

1

Il trucco sta nel modo in cui si aggiungono elementi nel vettore e quali funzioni membro del vettore si utilizza.

std::vector<A> v; 
v.emplace_back(3); 
5

I modelli non sono istanziati in un colpo solo: essi istanziare solo ciò che è necessario. A soddisfa tutte le condizioni per la seguente (costruendo un vettore vuoto) di essere valida:

std::vector<A> v; 

Tuttavia, come A non ha un costruttore di default, la seguente (creando un vettore con contenuto predefinito inizializzata) fallirebbe :

std::vector<A> v(100); 

E questa è una buona cosa. Tuttavia, i metodi validi saranno istanziati bene:

v.emplace_back(42); 
+0

Grazie Barry! Non girerò mai la testa intorno a questa parola: p – Quentin

Problemi correlati