Inicializando a estrutura estática em uma classe
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?
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.