4

クラスの静的変数として tm 構造体を使用したいと思います。一日中読んで試してみましたが、それでもうまくいきません:(誰かが私が間違っていたことを指摘していただければ幸いです

私のクラスでは、パブリックの下で、次のように宣言しました。

static struct tm *dataTime;

main.cpp で、テストのために一時的にシステム時間を定義および初期化しようとしました (実際の時間は実行時に入力されます)。

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

しかし、関数の外で time() を使用できないようです。

main.cpp:28: エラー: '(' トークンの前にコンストラクタ、デストラクタ、または型変換が必要です

クラスの静的 tm で値を初期化するにはどうすればよいですか?

4

6 に答える 6

7

上記を関数でラップできます。

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

tm Indice::dataTime = initTm();

リンクの問題を回避するには、関数を静的にするか、名前のない名前空間に配置します。

于 2010-01-20T21:29:23.253 に答える
4
struct tm get_current_localtime() {
    time_t now = time(0);
    return *localtime(&now);
}

struct tm Indice::dataTime = get_current_localtime();
于 2010-01-20T21:29:49.530 に答える
3

全体を関数でラップし、それを使用して静的メンバーを初期化します。

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

tm Indice::dataTime = gettime();

structまた、C++ では構造体の使用に接頭辞を付ける必要はありません (したがってすべきではありません) :tmで十分struct tmです。必要ありません。

于 2010-01-20T21:30:48.133 に答える
2

関数の外で任意に関数を呼び出すことはできません。関数で初期化を行うか、初期化を行うコンストラクターを使用しmain()て構造体の周りにラッパー クラスを作成しtmます。

于 2010-01-20T21:28:43.743 に答える
1

struct tmまた、 yourは tm 構造体へのポインターであることに注意してください。localtime からの戻り値はシングルトン ポインターであり、その内容は、あなたまたは他の誰かが localtime を再度呼び出したときに変更されます。

于 2010-01-20T21:31:06.963 に答える
0

これを追加:

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

オブジェクト ファイルが実行時に初期化されると、コンストラクター Initializer() が呼び出され、必要に応じて「グローバル」変数 dataTime が設定されます。匿名名前空間の構築は、Initializer と myinit の名前の衝突の可能性を防ぐのに役立つことに注意してください。

于 2010-01-20T21:33:54.887 に答える