So che in genere si inizializza una variabile membro statica all'interno di un file cpp. Ma la mia domanda è: perché lo ha?Perché si _have_ per inizializzare una variabile membro statica C++?
Ecco un esempio:
#include <vector>
using namespace std;
class A {
public:
static vector<int> x;
};
main() {
int sz = A::x.size();
}
Questo dà un errore di compilazione: undefined reference to 'A::x'
Tuttavia, questo:
#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 e funziona bene.
Posso capire se stavo inizializzando il vettore usando qualcosa di diverso dal costruttore predefinito, ma non lo sono. Voglio solo un vettore di dimensione 0 creato. Sicuramente, tutti i membri statici dovranno allocare memoria sull'inizializzazione del programma, quindi perché il compilatore non usa semplicemente il costruttore predefinito?
+1 ma è necessario eliminare uno dei duplicati. Per gli oggetti, RAII rende l'inizializzazione (anche se solo per costruttore predefinito) una conseguenza della definizione. Funziona per i puntatori grezzi, i tipi builtin come 'int'? –
Intendevo dire che è possibile aggiungere l'inizializzazione lì, se lo si desidera. Aggiungerò la precisione – Klaim
@Steve I costruttori di tipo POD sono solo sintattici, quindi sì funziona, ma in realtà non fa nulla (o per essere ancora più preciso, non può fare nulla - dallo standard C++). –