2009-11-06 13 views
24

¿cómo podría decirle a STL, específicamente para el método resize() en el vector, para inicializar objetos con un constructor que no sea el predeterminado, y con qué parámetros?stl vector y C++: cómo .resize sin un constructor predeterminado?

quiero decir:

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

std::vector<something> many_things; 

many_things.resize (20); 

de manera más general, ¿cómo podría obligar a STL para usar mi costructor cuando se van a crear objetos, y pasar parámetros a ese constructor?

en mi caso agregar un constructor predeterminado no es una opción, y preferiría no utilizar una matriz de punteros para resolver el problema.

Respuesta

43

Utilice la sobrecarga de 2-argumento: many_things.resize(20, something(5));

0

Puede usar reserve() para aumentar el tamaño del búfer y agregar manualmente (push_back()) los elementos necesarios en un bucle.

+1

Luego tiene un bucle explícito codificado en lugar del implícito utilizado por 'resize'. –

0

Con la especialización similar Este (lo siento, escribió esto con sólo controles mínimos)?

#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; 
} 

Pero piense si realmente lo necesita. ¿Por qué no crear un constructor predeterminado en su lugar?

1

Puedo pensar en una solución, pero te lo advierto, es bastante fea. No sé por qué no quieres agregar un constructor predeterminado, pero si solo quieres evitar que los usuarios de la clase creen instancias no personalizadas, puedes hacer que el constructor predeterminado sea privado y declarar amigo a la clase vectorial apropiada:

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

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

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

Esto es feo por varias razones, principalmente porque solo funciona para un tipo de contenedor. No hay otra forma, porque los contenedores STL simplemente requieren que sus elementos sean predecibles.

+2

He descubierto que esto no funciona porque 'std :: vector ' delega la construcción a otra clase y la amistad se vuelve inútil. Ver [aquí] (http://stackoverflow.com/questions/2907432/c-friend-class-stdvector) –

+0

¡Gracias por la actualización! Supongo que eso es lo que obtienes por depender de los detalles de implementación. _3.5-years-ago-me_ no fue tan experimentado :) –

+0

en vivo y aprender;) –