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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top