Инициализация статической структуры tm в классе - PullRequest
4 голосов
/ 21 января 2010

Я хотел бы использовать структуру tm в качестве статической переменной в классе. Целый день потратил на чтение и попытку, но все равно это не сработало :( Буду признателен, если кто-нибудь укажет, что я делаю неправильно

В моем классе под Public я объявил:

static struct tm *dataTime;

В main.cpp я попытался определить и инициализировать его системным временем для временного тестирования (фактическое время, вводимое во время выполнения)

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

но кажется, что я не могу использовать time () вне функций.

main.cpp: 28: ошибка: ожидается конструктор, деструктор или тип преобразование до ‘(’ токена

Как инициализировать значения в статическом классе класса?

Ответы [ 6 ]

7 голосов
/ 21 января 2010

Вы можете обернуть вышеупомянутое в функцию:

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

tm Indice::dataTime = initTm();

Чтобы избежать возможных проблем со связыванием, сделайте функцию статической или поместите ее в безымянное пространство имен.

4 голосов
/ 21 января 2010
struct tm get_current_localtime() {
    time_t now = time(0);
    return *localtime(&now);
}

struct tm Indice::dataTime = get_current_localtime();
3 голосов
/ 21 января 2010

Оберните все это в функцию и используйте ее для инициализации вашего статического члена:

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

tm Indice::dataTime = gettime();

И вам не нужно (и, следовательно, не нужно) использовать префикс структуры с struct в C ++: достаточно tm, struct tm не требуется.

2 голосов
/ 21 января 2010

Вы не можете вызывать функции произвольно вне функций. Либо выполните инициализацию в функции main(), либо создайте класс-оболочку вокруг структуры tm с помощью конструктора, выполняющего инициализацию.

1 голос
/ 21 января 2010

Также обратите внимание, что ваш struct tm является указателем на структуру tm. Возвращением из localtime является одноэлементный указатель, содержимое которого изменится, когда вы или кто-либо еще снова вызовете localtime.

0 голосов
/ 21 января 2010

Добавить это:

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

Когда объектный файл инициализируется во время выполнения, вызывается конструктор Initializer (), который затем устанавливает «глобальную» переменную dataTime по своему усмотрению. Обратите внимание, что конструкция анонимного пространства имен помогает предотвратить возможные конфликты имен Initializer и myinit.

...