クラスの静的構造物TMの初期化
質問
TM構造体をクラスの静的変数として使用したいと思います。一日を読んで試してみましたが、それでもうまくいけません:(誰かが私が間違っていたことを指摘できたら感謝します
私のクラスでは、公の場で、私はそれを次のように宣言しました。
static struct tm *dataTime;
main.cppでは、システム時間で一時的にテストするために定義して初期化しようとしました(実行時に入力する実際の時間)
time_t rawTime;
time ( &rawTime );
tm Indice::dataTime = localtime(&rawTime);
しかし、外部関数を使用できないようです。
main.cpp:28:エラー:予想されるコンストラクター、デストラクタ、またはタイプ変換の前に '('トークン
クラスの静的TMの値を初期化するにはどうすればよいですか?
解決
上記を関数でラップできます。
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の使用をプレフィックスする必要はありません(したがってそうすべきではありません) struct
C ++で: tm
十分です、いいえ struct tm
必要です。
関数を任意に外部に呼び出すことはできません。どちらもあなたの初期化を行います main()
機能、またはその周りにラッパークラスを作成します tm
初期化を行うコンストラクターを備えた構造。
また、あなたに注意してください struct tm
TM構造体へのポインターです。 LocalTimeからの復帰は、あなたまたは他の誰かがLocalTimeに再び電話をかけると、その内容が変わるシングルトンポインターです。
これを追加:
namespace {
class Initializer {
public:
Initializer() {
time_t rawtime; time(&rawtime);
YourClass::dataTime = localtime(&rawtime);
}
};
static Initializer myinit();
}
オブジェクトファイルが実行時に初期化されると、コンストラクターIniveryizer()が呼び出され、「グローバル」変数データタイムを必要に応じて設定します。匿名の名前空間構造は、名前InitializerとMyInitの名前の潜在的な衝突を防ぐのに役立つことに注意してください。