Sto usando questo due classiC++, come copiare correttamente std :: vector <Class *> nel costruttore di copie?
// This is generic data structure containing some binary data
class A {
public:
A();
A(const A&);
~A();
}
// Main data container
class B {
public:
B();
B(const B&);
~B();
protected:
std::vector<A *> data;
}
// Copy constructor for class b
B::B(const B& orig):data() {
for(std::vector<A *>::const_iterator it = orig.data.begin();
it < orig.data.end(); ++it){
data.push_back(new A(*(*it)));
}
}
Credo che questa classe avrebbe fatto lavoro, ma sto trovando per strada come raggiungere la perfezione totale in questo.
Inizialmente :data()
- questa inizializzazione è necessaria per inizializzare correttamente il vettore vuoto (ed è parte della scrittura di un codice buono e pulito)?
Come utilizzare vector::iterator
nel costruttore di copie, l'unico modo che ho trovato è quello che ho scritto nel codice (const dovrebbe essere obbligatorio per il costruttore di copie).
La copia solo vettoriale copiava solo i valori del puntatore e non interi oggetti?
E infine l'inizializzazione di nuovi dati ... Esiste un modo per sostituire l'intero ciclo con un pezzo di codice più piccolo e/o esiste un metodo standard per scrivere il costruttore di copia per std :: contenitori che contiene puntatori di oggetti?
domanda secondaria: sto assumendo utilizzando vector<A *>
è molto più adatto ed efficace per vari motivi che solo vector<A>
(non copiare ogni volta, il potere di decidere se (non) per copiare gli oggetti ...)
Intendevi "Domanda secondaria: presumo l'utilizzo di un vettore di puntatori ..." –
Prealloca' dati' nella lista di inizializzazione.Utilizzo 'push_back()' come quello è molto inefficace – lapk
Risposta secondaria: Penso che, se non si possono usare i puntatori, non si dovrebbero usare. – Lol4t0