我在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中,我想使用这个静态列表,但是列表是空的。你能解释一下我如何使用静态成员来访问相同的列表吗?
第二类声明:
in mainWindow.h:
ShoppingLists slDialog;
在mainWindow.cpp我调用:
slDialog.setModal(true); slDialog.show();
顺便说一句。:整个事情是一个CocktailDatabase,所以我的目标是有一个列表/地图鸡尾酒-,成分-,装饰-,和味道-对象,我可以使用,而无需从SQLite重新加载它。
1)静态成员只存在一次,并且在Decoration的所有实例之间共享。
问题是为什么它是空的。这里有一些提示:a)你认为它是空的,因为一些窗口对象没有刷新,不知道你的列表被填充。
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);
您正在使用静态变量在有机会填充之前的默认构造值。如果在使用该值的代码和初始化该值的代码中放置断点,您将看到后者在之后被称为。