繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM