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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top