Ciao, come da titolo avrei dei dubbi sul quando e dove inizializzare i dati membro statici privati di una classe dichiarata ed utilizzata all'interno di un singolo file .cpp.
Un paio di considerazioni preliminari:
- i dati membro statici sono inizializzati a zero di default, giusto?
- nel mio caso il dato membro statico è un array, il quale ipotizzo necessiti di un'apposita funzione membro statica per la sua inizializzazione;
- la suddetta funzione membro statica addetta alla modifica dell'array deve essere richiamata una sola volta.
Consideriamo quindi il seguente esempio:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
class A
{
private:
int n;
static int v[10];
static void set_v();
public:
A(const int N);
void fun();
};
int A::v[10];
void A::set_v()
{
for(unsigned int i = 0; i < 10; v[i++] = rand() % 10 + 1);
}
A::A(const int N)
{
if(!v[0])
{
set_v();
}
n = N;
}
void A::fun()
{
for(unsigned int i = 0; i < 10; ++i)
{
cout << (v[i] < n ? to_string(v[i]) : "-") << " ";
}
cout << endl;
}
int main()
{
srand(time(0));
A a1(6);
a1.fun();
A a2(6);
a2.fun();
}
L'inizializzazione (o forse sarebbe più corretto parlare di assegnazione) del dato membro statico A::v è affidata alla funzione membro statica A::set_v(), ma il problema è quando e dove richiamarla, tenendo anche conto del fatto che deve essere richiamata una sola volta.
L'unica cosa che mi è venuta in mente per risolvere il problema è stata quella di inserire set_v() all'interno del costruttore della classe, e per fare in modo che set_v() venga richiamata una sola volta ho sfruttato l'inizializzazione a zero di default dei dati membro statici.
A funzionare sembra che funzioni, ma mi chiedevo, anche considerando i limiti relative alle mie conoscenze del linguaggio, se esista un modo diverso e “più corretto” per farlo.