Инициализация статической структуры tm в классе
Я хотел бы использовать структуру tm в качестве статической переменной в классе. Целый день потратил на чтение и попытку, но это все равно не работает:(Буду признателен, если кто-то укажет, что я делаю неправильно
В моем классе под Public я объявил это как:
static struct tm *dataTime;
В main.cpp я попытался определить и инициализировать его системным временем, чтобы временно проверить его (фактическое время, которое нужно ввести во время выполнения)
time_t rawTime;
time ( &rawTime );
tm Indice::dataTime = localtime(&rawTime);
но кажется, что я не могу использовать time() вне функций.
main.cpp: 28: ошибка: ожидаемый конструктор, деструктор или преобразование типов перед токеном '('
Как я могу инициализировать значения в статическом классе?
6 ответов
Вы можете обернуть вышеупомянутое в функцию:
tm initTm() {
time_t rawTime;
::time(&rawTime);
return *::localtime(&rawTime);
}
tm Indice::dataTime = initTm();
Чтобы избежать возможных проблем со связыванием, сделайте функцию статической или поместите ее в безымянное пространство имен.
struct tm get_current_localtime() {
time_t now = time(0);
return *localtime(&now);
}
struct tm Indice::dataTime = get_current_localtime();
Оберните все это в функцию и используйте ее для инициализации статического члена:
tm gettime() {
time_t rawTime;
time ( &rawTime );
return localtime(&rawTime);
}
tm Indice::dataTime = gettime();
И вам не нужно (и, следовательно, не должно) префикс использования структуры с struct
в C++: tm
достаточно, нет struct tm
необходимо.
Вы не можете вызывать функции произвольно вне функций. Либо сделайте инициализацию в вашем main()
или создать класс-оболочку вокруг tm
struct с конструктором, который выполняет инициализацию.
Также обратите внимание, что ваш struct tm
указатель на структуру тм Возвращением из localtime является одноэлементный указатель, содержимое которого изменится, когда вы или кто-либо еще снова вызовете localtime.
Добавь это:
namespace {
class Initializer {
public:
Initializer() {
time_t rawtime; time(&rawtime);
YourClass::dataTime = localtime(&rawtime);
}
};
static Initializer myinit();
}
Когда объектный файл инициализируется во время выполнения, вызывается конструктор Initializer(), который затем устанавливает "глобальную" переменную dataTime по своему усмотрению. Обратите внимание, что конструкция анонимного пространства имен помогает предотвратить возможные конфликты имен Initializer и myinit.