La inicialización de estructura tm estático en una clase
Pregunta
Me gustaría utilizar la estructura tm como una variable estática en una clase. Pasado un día entero leyendo y tratando, pero todavía no puede funcionar :( agradecería si alguien podría señalar lo que estaba haciendo mal
En mi clase, en Público, he declarado como:
static struct tm *dataTime;
En el main.cpp, he tratado de definir e inicializar con la hora del sistema temporal para poner a prueba (el tiempo real que se introducirá en tiempo de ejecución)
time_t rawTime;
time ( &rawTime );
tm Indice::dataTime = localtime(&rawTime);
pero parece que no puedo usar el tiempo () funciones externas.
main.cpp: 28: error: se esperaba constructor, destructor, o escribe conversión antes de ‘(’ contador
¿Cómo iniciar los valores en un tm estático de una clase?
Solución
Se puede concluir de lo anterior en una función:
tm initTm() {
time_t rawTime;
::time(&rawTime);
return *::localtime(&rawTime);
}
tm Indice::dataTime = initTm();
Para evitar posibles problemas de enlace, hacer que la función estática o ponerlo en un espacio de nombres sin nombre.
Otros consejos
struct tm get_current_localtime() {
time_t now = time(0);
return *localtime(&now);
}
struct tm Indice::dataTime = get_current_localtime();
Wrap todo el asunto en una función, y el uso que para inicializar el miembro estático:
tm gettime() {
time_t rawTime;
time ( &rawTime );
return localtime(&rawTime);
}
tm Indice::dataTime = gettime();
Y usted no necesita (y por lo tanto no debería) prefijo estructura con el uso struct
en C ++:. tm
es suficiente, no necesita struct tm
No se puede llamar a funciones arbitrariamente funciones externas. O bien hacer la inicialización en su función main()
, o crear una clase contenedora alrededor de la estructura tm
con un constructor que hace la inicialización.
Tenga en cuenta también que su struct tm
es un puntero a una estructura tm. El regreso de localtime es un puntero Singleton cuyo contenido va a cambiar cuando usted o cualquier otra persona LOCALTIME llamadas de nuevo.
añadir lo siguiente:
namespace {
class Initializer {
public:
Initializer() {
time_t rawtime; time(&rawtime);
YourClass::dataTime = localtime(&rawtime);
}
};
static Initializer myinit();
}
Cuando el archivo de objeto se inicializa en tiempo de ejecución, la inicialización del constructor () se llama que a su vez establece el DataTime variable "global" como desee. Tenga en cuenta que la construcción de espacio de nombres en el anonimato ayuda a prevenir choques potenciales para los nombres de inicializador y MyInit.