#include <QQueue>
#include <QString>
class Util {
public:
static QQueue<QString> links;
Util() {
}
};
Util::links.enqueue("hello world");
我該怎麼做?在C++中初始化非原始類靜態數據類型
#include <QQueue>
#include <QString>
class Util {
public:
static QQueue<QString> links;
Util() {
}
};
Util::links.enqueue("hello world");
我該怎麼做?在C++中初始化非原始類靜態數據類型
你初始化像往常一樣,在全球範圍內:
QQueue<QString> Util::links;
或
QQueue<QString> Util::links(1); // with constructor parameters if necessary
除「hello world」外不存在!此外,[QQueue](http://qt-project.org/doc/qt-4.8/qqueue.html)沒有該構造函數 – Shahbaz
嘗試使用靜態成員函數:
#include <QQueue>
#include <QString>
class Util {
public:
static QQueue<QString>& links() {
static QQueue<QString> instance;
static bool is_init = false;
if(!is_init) {
instance.enqueue("hello world");
is_init = true;
}
return instance;
}
Util() {
}
};
在C++ 11 QQueue似乎以支持初始化列表,正如Shahbaz所說:
QQueue<QString> Util::links = {"hello world"};
在多線程程序中,您需要確保初始化它在允許多個線程訪問它之前。你沒有這個靜態對象的問題。 –
@MikeSeymour是的,一個靜態成員函數不是一個好的解決方案。 – Pubby
你可以用函數的結果初始化它:
QQueue<QString> make_links() {
QQueue<QString> queue;
queue.enqueue("hello world");
return queue;
}
QQueue<QString> Util::links = make_links();
我不熟悉,QT,但人們可能會希望他們所添加的C++ 11初始化器列表的支持,其中情況下,你可以初始化它:
QQueue<QString> Util::links {"hello world"};
(更新:根據沙赫巴茲的評論的鏈接,你確實可以做,如果你使用的是C++ 11)。
您可以使用靜態初始化的對象爲所有這樣的病例:
頭文件:
#include <QQueue>
#include <QString>
class Util {
public:
static QQueue<QString> links;
Util() {
}
};
CPP文件:
namespace {
struct StaticInitializer {
StaticInitializer() {
Util::links.enqueue("hello world");
}
} initializer;
}
也許http://qt-project.org/doc /qt-4.8/qlist.html#QList-3可能很有用 – Shahbaz