Sé que generalmente inicializa una variable de miembro estática desde dentro de un archivo .cpp. Pero mi pregunta es: ¿por qué tiene?¿Por qué tienes que inicializar una variable de miembro estática de C++?
He aquí un ejemplo:
#include <vector>
using namespace std;
class A {
public:
static vector<int> x;
};
main() {
int sz = A::x.size();
}
Esto da un error del compilador: undefined reference to 'A::x'
Sin embargo, esto:
#include <vector>
using namespace std;
class A {
public:
static vector<int> x;
};
// Initialize static member
vector<int> A::x;
main() {
int sz = A::x.size();
}
compila y funciona muy bien.
Entiendo si estaba inicializando el vector usando algo que no sea el constructor predeterminado, pero no lo estoy. Solo quiero crear un vector de tamaño 0. Seguramente, a los miembros estáticos se les tendrá que asignar memoria en la inicialización del programa, entonces, ¿por qué el compilador simplemente no usa el constructor predeterminado?
+1 pero debe eliminar uno de los dups. Para los objetos, RAII hace que la inicialización (aunque solo sea por el constructor predeterminado) sea una consecuencia de la definición. ¿Esto funciona para punteros crudos, tipos integrados como 'int'? –
Quería decir que puede agregar la inicialización allí si lo desea. Agregaré la precisión. – Klaim
@Steve Los constructores de tipo POD son solo sintácticos, por lo que sí funciona, pero en realidad no hace nada (o para ser aún más preciso, no permite hacer nada, según el estándar de C++). –