[英]C++ static members, multiple Objects
我在C ++中使用靜態成員和方法遇到了一些麻煩。 這是Class標頭:
class Decoration {
public:
//Static Methods
static void reloadList();
//Static Members
static std::unordered_map<int, Decoration> decorationMapID;
};
在.cpp中:
void Decoration::reloadList() {
sqlTable result = db->exec("SELECT id, name, description FROM decorations");
for(sqlRow r: result) {
Decoration::decorationMapID.insert(std::pair<int,Decoration>(atoi(r[0].c_str()), Decoration(r[1], r[2], atoi(r[0].c_str()))));
}
}
現在,在我的mainWindow
類(我正在使用QT5)中,我調用reloadList()
並初始化地圖。 現在,列表已填充到該對象中。
在另一個Window-Class中,我想使用此靜態列表,但是列表為空。 您能否解釋一下我必須如何使用靜態成員才能在各處訪問同一列表?
二等聲明:
在mainWindow.h中:
ShoppingLists slDialog;
在mainWindow.cpp中,我調用:
slDialog.setModal(true); slDialog.show();
順便說一句:整個都是一個CocktailDatabase,所以我的目標是要有一個Cocktail-,Ingredient-,Decoration-和Taste-Objects的列表/映射,我可以使用它而無需從SQLite重新加載它。
您正在使用靜態變量的默認構造值,然后才能填充它。 如果將斷點放在使用該值的代碼和對其進行初始化的代碼中,則會看到后者在前者之后被調用。
1)靜態成員僅存在一次,並且在裝飾的所有實例之間共享。
2)問題是為什么它為空。 這里有一些提示:a)您認為它為空,因為未刷新某些Windows對象並且不知道您的列表已被偽造。
b)在初始化靜態列表之前初始化窗口
3)盡管如此,建議:不要public
您的靜態列表,尤其是在使用靜態列表之前必須對其進行初始化的情況下。 使用確保已初始化的公共訪問功能。 這里是一個大概的想法:
class Decoration {
public:
std::unordered_map<int, Decoration> getMap();
protected: // or even private ?
static void reloadList();
static bool loaded=false;
static std::unordered_map<int, Decoration> decorationMapID;
};
其中getMap()類似於:
if (!loaded) {
... // load the list here
loaded = true;
}
return (decorationMapID);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.