簡體   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