L'inizializzazione tm struct statica in una classe
Domanda
Vorrei utilizzare la struct tm come una variabile statica in una classe. Abbiamo trascorso un giorno intero di lettura e cercando ma ancora non può funzionare :( apprezzerei se qualcuno potesse sottolineare quello che stavo facendo male
Nella mia classe, sotto pubblica, ho dichiarato come:
static struct tm *dataTime;
Nel main.cpp, ho cercato di definire e inizializzarlo con il tempo di sistema temporaneamente per testare (tempo effettivo da inserire in fase di esecuzione)
time_t rawTime;
time ( &rawTime );
tm Indice::dataTime = localtime(&rawTime);
, ma sembra che io non posso usare il tempo () al di fuori funzioni.
main.cpp: 28: Errore: atteso costruttore, distruttore o tipo conversione prima ‘(’ token
Come faccio a inizializzare i valori in una TM statica di una classe?
Soluzione
È possibile avvolgere la sopra in una funzione:
tm initTm() {
time_t rawTime;
::time(&rawTime);
return *::localtime(&rawTime);
}
tm Indice::dataTime = initTm();
Per evitare possibili problemi di collegamento, effettuare la funzione statica o metterlo in uno spazio dei nomi senza nome.
Altri suggerimenti
struct tm get_current_localtime() {
time_t now = time(0);
return *localtime(&now);
}
struct tm Indice::dataTime = get_current_localtime();
Avvolgere il tutto in una funzione, e l'uso che per inizializzare il membro statico:
tm gettime() {
time_t rawTime;
time ( &rawTime );
return localtime(&rawTime);
}
tm Indice::dataTime = gettime();
E non c'è bisogno di (e quindi non dovrebbe) l'utilizzo del prefisso struct con struct
in C ++:. tm
è sufficiente, non struct tm
necessario
Non è possibile chiamare funzioni arbitrariamente funzioni esterne. O fare l'inizializzazione nella funzione main()
, o di creare una classe wrapper per l'struct tm
con un costruttore che fa l'inizializzazione.
Si noti inoltre che il vostro struct tm
è un puntatore ad una struct tm. Il ritorno da localtime è un puntatore singoletto il cui contenuto cambia quando tu o chiunque altro le chiamate localtime di nuovo.
Aggiungi questo:
namespace {
class Initializer {
public:
Initializer() {
time_t rawtime; time(&rawtime);
YourClass::dataTime = localtime(&rawtime);
}
};
static Initializer myinit();
}
Quando il file oggetto viene inizializzato in fase di esecuzione, il costruttore Initializer () viene chiamata che poi imposta la DataTime variabile "globale" come si desidera. Si noti che la costruzione namespace anonimo aiuta a prevenire possibili scontri per i nomi Initializer e myinit.