Pergunta

Eu gostaria de usar a estrutura da TM como uma variável estática em uma classe. Passei um dia inteiro lendo e tentando, mas ainda não pode funcionar :( apreciaria se alguém pudesse apontar o que eu estava fazendo de errado

Na minha classe, em público, eu o declarei como:

static struct tm *dataTime;

No main.cpp, tentei defini -lo e inicializar com o tempo do sistema temporariamente para testar (tempo real para ser inserido em tempo de execução)

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

Mas parece que não posso usar o tempo () funções externas.

Main.cpp: 28: Erro: Construtor esperado, destruidor ou conversão de tipo antes de '(' token

Como faço para inicializar os valores em uma TM estática de uma classe?

Foi útil?

Solução

Você pode envolver o acima em uma função:

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

tm Indice::dataTime = initTm();

Para evitar possíveis problemas de vinculação, faça da função estática ou coloque -a em um espaço para nome sem nome.

Outras dicas

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

struct tm Indice::dataTime = get_current_localtime();

Enrole a coisa toda em uma função e use -a para inicializar seu membro estático:

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

tm Indice::dataTime = gettime();

E você não precisa (e, portanto, não deveria) prefixar o uso de estrutura com struct em C ++: tm é suficiente, não struct tm precisava.

Você não pode chamar funções arbitrariamente fora das funções. Faça a inicialização em seu main() função ou criar uma classe de wrapper em torno do tm estrutura com um construtor que faz a inicialização.

Observe também que seu struct tm é um ponteiro para uma estrutura TM. O retorno da LocalTime é um ponteiro de singleton cujo conteúdo mudará quando você ou qualquer outra pessoa ligar novamente para o local.

Adicione isso:

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

Quando o arquivo de objeto é inicializado em tempo de execução, o inicializador do construtor () é chamado, que define a variável "global" que você deseja. Observe que a construção de namespace anônimo ajuda a evitar possíveis confrontos para o Inicializador e o MyInit de nomes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top