[英]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.