これは私のC++ヘッダーファイルにあります。
#include <QMap>
#include <QString>
class LogEvent {
public:
LogEvent();
enum column_t {TIMESTAMP_COLUMN = 0, TYPE_COLUMN = 1, EVENT_COLUMN = 2,
FILE_COLUMN = 3};
static QMap<column_t, QString> COLUMN_NAMES;
static QMap<column_t, QString> getColumnNames() {
return LogEvent::COLUMN_NAMES;
}
//blah blah blah other functions
};
これは私のC++ソースファイルです。
#include "LogEvent.h"
LogEvent::LogEvent()
{
//constructor code
}
//blah blah blah other functions
静的QMapCOLUMN_NAMESに値を追加したいと思います。どこでどのようにこれを行うのですか?
それまでの間、Qt5.2ではQMapにC++ 11初期化子リストのサポートが追加されました。
QMap::QMap(std::initializer_list<std::pair<Key, T> > list)
これは、次のようにマップを初期化できることを意味します。
static QMap<QString, int> my_map{{"a", 1}, {"b", 2}, {"c", 3}};
イニシャライザリストを使用する別のアプローチ。
QMap<QString, QString> qmap_(std::map<QString, QString> {{ "", "" }});
これは、Qtがイニシャライザリストを直接操作するように修正される前の古いQtで機能します。
Std :: mapを作成し、それを使用してQMapを初期化するか、QMapをstd :: map:に置き換えることができます。
static const std::pair<T1, T2> arr[] = {
std::pair<T1, T2>(v1, v2),
std::pair<T1, T2>(v3, v4),
};
static std::map<T1, T2> my_map(arr, arr + sizeof(arr) / sizeof(arr[0]));
QMap<column_t, QString> LogEvent::COLUMN_NAMES(my_map);
もう1つの方法は、コンストラクターでCOLUMN_NAMESを初期化することです。
LogEvent::LogEvent() {
if (COLUMN_NAMES.isEmpty())
;//init it here
ただし、これはスレッドセーフではありません。最初のメソッドはmainの前に呼び出され、2番目のメソッドは実行時に呼び出される可能性があります。