2010-01-20 15 views
3

Je voudrais utiliser la structure tm en tant que variable statique dans une classe. Nous avons passé une journée à lire et à essayer, mais il ne peut toujours pas travailler :(apprécierions si quelqu'un pouvait indiquer ce que je faisais malInitialisation de la structure statique dans une classe

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 comme si je ne peux pas utiliser le temps() fonctions extérieures

main.cpp:28: error: expected constructor, destructor, or type conversion before ‘(’ token

Comment initialiser des valeurs dans un tm statique d'une classe?

+0

dataTime a 'tm *' ou un 'tm'? –

+0

Il vaut mieux ne pas être 'tm *', car 'localtime' renvoie une instance statique. –

Répondre

7

Vous pouvez envelopper ci-dessus en 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.

+2

+1 Pour un espace de noms sans nom. (Toux, pas anonyme, toux) – GManNickG

+1

Merci, changé. Peut-être que je mémoriserai la plupart des termes C++ un jour ... –

+0

Heh, il y en a trop. Je suis simplement stupide, anonyme et sans nom signifie la même chose, mais pas selon la norme. : | Comité stupide. – GManNickG

2

Vous ne pouvez pas appeler des fonctions arbitrairement en dehors des fonctions. Faites l'initialisation dans votre fonction main() ou créez une classe wrapper autour de la structure tm avec un constructeur qui effectue l'initialisation.

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

struct tm Indice::dataTime = get_current_localtime(); 
2

Enroulez 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 struct tm nécessaire.

1

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

+0

'localtime' renvoie une instance statique. Donc, ce n'est pas thread-safe ou réentrant. Il y a aussi 'localtime_r' pour plus de robustesse. –

+0

Ma réponse le compense légèrement en copiant son contenu tout de suite, mais ne le rend pas compatible avec les threads. –

+0

Je ne m'en suis pas rendu compte. Mis à jour, merci. Quel motif loufoque c'est. –

0

Ajouter 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 de l'espace de noms anonyme permet d'éviter les collisions potentielles pour les noms Initializer et myinit.

+0

Cette méthode a-t-elle un avantage par rapport à l'initialisation directe en utilisant la fonction mentionnée ci-dessus –