2009-11-06 9 views
24

come potrei dire a STL, in particolare per il metodo resize() in vettoriale, per inizializzare gli oggetti con un costruttore diverso da quello predefinito e con quali parametri?vettore stl e C++: come .resize senza un costruttore predefinito?

voglio dire:

class something { 
    int a; 
    something (int value); 
} 

std::vector<something> many_things; 

many_things.resize (20); 

più in generale, come potevo forzare STL di usare la mia costructor quando è necessario creare oggetti e passare i parametri a quel costruttore?

nel mio caso l'aggiunta di un costruttore predefinito non è un'opzione e preferirei non utilizzare una serie di puntatori per risolvere il problema.

risposta

43

Usare il sovraccarico 2-argomento: many_things.resize(20, something(5));

0

È possibile utilizzare reserve() per aumentare la dimensione del buffer e aggiungere manualmente (push_back()) gli elementi necessari in un ciclo.

+1

Si ha quindi un ciclo esplicito codificato invece dell'implicito utilizzato da 'ridimensiona'. –

0

Con la specializzazione allo stesso modo Questo (mi dispiace, ho scritto questo con solo controlli minimi)?

#include <vector> 

class MyClass 
{ 
    private: 
     MyClass(); 
    public: 
     MyClass(unsigned i) : _data(i) {}; 

    private: 
     unsigned _data; 
}; 

typedef std::vector<MyClass> MyVector; 

void MyVector::resize(MyVector::size_type new_size) 
{ 
    this->resize(new_size, MyClass(5)); 
} 

int main() 
{ 
    MyVector vector; 
    vector.resize(5); 

    return 0; 
} 

Ma pensate se ne avete davvero bisogno. Perché non creare invece un costruttore predefinito?

1

Posso pensare a una soluzione, ma ti avverto, è piuttosto brutto. Non so perché non vuoi aggiungere un costruttore predefinito, ma se vuoi solo impedire agli utenti della classe di creare istanze non personalizzate, puoi semplicemente rendere privato il costruttore predefinito e dichiarare un appropriato amico della classe vettoriale:

class Foo { 
public: 
    Foo(int x) : num(x) {} 

    int GetX() { return num; } 
private: 
    friend class std::vector<Foo>; 

    int num; 
    Foo() : num(10) {} 
}; 

Questo è brutto per diversi motivi, principalmente perché funziona solo per un tipo di contenitore. Non c'è altro modo, perché i contenitori STL richiedono semplicemente che i loro articoli siano costruttibili di default.

+2

Ho trovato che questo non funziona perché 'std :: vector ' delega la costruzione a un'altra classe e quindi l'amicizia diventa inutile. Vedi [qui] (http://stackoverflow.com/questions/2907432/c-friend-class-stdvector) –

+0

Grazie per l'aggiornamento! Immagino sia quello che ottieni a seconda dei dettagli di implementazione. _3.5 anni fa-me_ non era così esperto :) –

+0

vivi e impara;) –

Problemi correlati