Question

Je voudrais utiliser la struct tm comme une variable statique dans une classe. Nous avons passé une journée à lire tout et d'essayer, mais il peut toujours pas :( apprécierions si quelqu'un pouvait indiquer ce que je faisais mal

Dans ma classe, sous licence publique, je l'ai déclaré comme:

static struct tm *dataTime;

Dans le main.cpp, j'ai essayé de définir et de l'initialiser avec le temps du système temporairement pour tester (temps réel à saisir lors de l'exécution)

time_t rawTime;
time ( &rawTime );
tm Indice::dataTime = localtime(&rawTime);

mais semble que je ne peux pas utiliser le temps () en dehors des fonctions.

  

main.cpp: 28: erreur: attendu   constructeur, destructor, ou du type   conversion avant « ( » token

Comment puis-je initialiser des valeurs dans une tm statique d'une classe?

Était-ce utile?

La solution

Vous pouvez envelopper ci-dessus dans une fonction:

tm initTm() {
    time_t rawTime;
    ::time(&rawTime);
    return *::localtime(&rawTime);
}

tm Indice::dataTime = initTm();

Pour éviter les problèmes de liaison possibles, rendre la fonction statique ou le mettre dans un espace de noms sans nom.

Autres conseils

struct tm get_current_localtime() {
    time_t now = time(0);
    return *localtime(&now);
}

struct tm Indice::dataTime = get_current_localtime();

Enveloppez le tout dans une fonction, et l'utiliser pour initialiser votre membre statique:

tm gettime() {
    time_t rawTime;
    time ( &rawTime );
    return localtime(&rawTime);
}

tm Indice::dataTime = gettime();

Et vous n'avez pas besoin (et ne devrait donc pas) l'utilisation de struct préfixe avec struct en C ++:. tm suffit, pas besoin struct tm

Vous ne pouvez pas appeler des fonctions arbitrairement en dehors des fonctions. Soit faire l'initialisation dans votre fonction main(), ou créer une classe wrapper autour de la struct tm avec un constructeur qui fait l'initialisation.

Notez également que votre struct tm est un pointeur vers une struct tm. Le retour de localtime est un pointeur singleton dont le contenu va changer lorsque vous ou quelqu'un d'autre LOCALTIME appels à nouveau.

Ajoutez à ceci:

namespace {
  class Initializer {
    public:
      Initializer() { 
        time_t rawtime; time(&rawtime);
        YourClass::dataTime = localtime(&rawtime);
      }
  };
  static Initializer myinit();
}

Lorsque le fichier objet est initialisé à l'exécution, le constructeur Initializer () est appelée qui définit alors la DataTime variable « globale » que vous voulez. Notez que la construction d'espace de noms anonyme aide à prévenir des affrontements potentiels pour les noms Initializer et MyInit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top