c++静态成员,多个对象



我在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); 

您正在使用静态变量在有机会填充之前的默认构造值。如果在使用该值的代码和初始化该值的代码中放置断点,您将看到后者在之后被称为

相关内容

  • 没有找到相关文章

最新更新