Frage

Ich möchte die TM -Struktur als statische Variable in einer Klasse verwenden. Ich habe einen ganzen Tag lang gelesen und versuchte, aber es kann immer noch nicht funktionieren :( würde schätzen, wenn jemand darauf hinweisen könnte, was ich falsch gemacht habe

In meiner Klasse habe ich es unter der Öffentlichkeit als:

static struct tm *dataTime;

Im Main.CPP habe ich versucht, es vorübergehend mit der Systemzeit zu definieren und zu initialisieren (tatsächliche Zeit, um zur Laufzeit eingegeben zu werden)

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

Aber scheint, dass ich Zeit () außerhalb der Funktionen nicht nutzen kann.

Main.CPP: 28: Fehler: Erwarteter Konstruktor, Destruktor oder Typ -Konvertierung vor '(' Token

Wie initialisiere ich Werte in einem statischen TM einer Klasse?

War es hilfreich?

Lösung

Sie können die oben genannten in einer Funktion einwickeln:

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

tm Indice::dataTime = initTm();

Um mögliche Verknüpfungsprobleme zu vermeiden, machen Sie die Funktion statisch oder setzen Sie sie in einen namenlosen Namespace.

Andere Tipps

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

struct tm Indice::dataTime = get_current_localtime();

Wickeln Sie das Ganze in eine Funktion und verwenden Sie das, um Ihr statisches Mitglied zu initialisieren:

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

tm Indice::dataTime = gettime();

Und Sie müssen (und sollten daher nicht) die Struktur verwenden, mit struct in C ++: tm ist genug, nein struct tm erforderlich.

Sie können Funktionen nicht willkürlich außerhalb von Funktionen anrufen. Entweder machen die Initialisierung in Ihrem main() Funktion oder erstellen Sie eine Wrapper -Klasse um die tm Struktur mit einem Konstruktor, der die Initialisierung durchführt.

Beachten Sie auch, dass Ihre struct tm ist ein Zeiger auf eine TM -Struktur. Die Rückkehr von Local Time ist ein Singleton -Zeiger, dessen Inhalt sich ändern wird, wenn Sie oder andere andere Lokalzeit anrufen.

Füge das hinzu:

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

Wenn die Objektdatei zur Laufzeit initialisiert wird, wird der Constructor Initializer () aufgerufen, der dann die "globale" variable DataTime so festlegt, wie Sie es möchten. Beachten Sie, dass die anonyme Namespace -Konstruktion dazu beiträgt, mögliche Zusammenstöße für den Namen Initializer und MyInit zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top