Cuando creo un std :: vector de objetos, el constructor de estos objetos no siempre se llama.¿Cómo llamar al constructor de objetos contenidos en un std :: vector?
#include <iostream>
#include <vector>
using namespace std;
struct C {
int id;
static int n;
C() { id = n++; } // not called
// C() { id = 3; } // ok, called
};
int C::n = 0;
int main()
{
vector<C> vc;
vc.resize(10);
cout << "C::n = " << C::n << endl;
for(int i = 0; i < vc.size(); ++i)
cout << i << ": " << vc[i].id << endl;
}
Ésta es la salida me sale:
C::n = 1
0: 0
1: 0
2: 0
...
Esto es lo que me gustaría:
C::n = 10
0: 0
1: 1
2: 2
...
En este ejemplo, ¿estoy obligado a cambiar el tamaño del vector y luego inicializar su elementos "manualmente"?
¿Podría ser que los elementos de un vector no se inicialicen de forma ordenada, desde el primero hasta el último, por lo que no puedo obtener un comportamiento determinista?
Lo que me gustaría hacer es contar fácilmente el número de objetos creados en un programa, en diferentes contenedores, en diferentes puntos del código, y darles una identificación única a cada uno de ellos.
¡Gracias!
No aceptar la respuesta que tiene actualmente. Es un truco y hace que tu código sea desordenado e inutilizable. El copy-constructor necesita copiar. – GManNickG
He agregado un ejemplo de cómo puede obtener los resultados que está buscando _en este caso_. Dicho eso, deberías expandirte en lo que quieres lograr al hacer esto. Los objetos de un tipo se crean y destruyen con frecuencia (por ejemplo, cuando tiene lugar una reasignación vectorial, se copian todos los objetos del vector). –
Si ilumina sus objetivos, estaremos encantados de brindarle una solución de trabajo segura. Pero tal como está, tus objetivos son contradictorios: no puedes distinguir cada objeto mientras colocas esos objetos en contenedores estándar. – GManNickG