2011-07-11 36 views
0

我有一個名爲CoolMenuItems試圖創建一個包含結構的數組類,這是預定義

class CoolMenuItems 
{ 
public: 
    CoolMenuItems(); 
    ~CoolMenuItems(); 

    struct MenuItemOne 
    { 
     int id; 
     uint32 type; 
     uint32 subtype; 
     String name; 
    }; 

    struct MenuItemTwo 
    { 
     uint32 subtype; 
     String name; 
    }; 
} 

這僅僅是類的裸露的骨頭...我想有兩個數組類, MenuItemOne之一和MenuItemTwo之一,這些數組將具有以下內容。這些陣列我想初始化,如:只

MenuItemOne a[] = 
{ 
    {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC,  0,            T("Parametric")}, 
    {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS, EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")}, 
}; 

MenuItemTwo b[] = 
{ 
    {EQData::EQ_FILTER_TYPE_TRHU,      T("Thru")}, 
    {EQData::EQ_FILTER_TYPE_BUTTERWORTH_6DB,   T("6 dB Butterworth")}, 

}; 

,比短短兩年多的元素......

我想設定,讓我可以創建一個新的CoolMenuItems與

CoolMenuItems *cmi = new CoolMenuItems(); 
對象

,這樣我可以經由

cmi->a[1]; 
+1

這裏有什麼具體問題?哪部分會給你帶來麻煩? –

+2

您是否希望每個CoolMenuItems都具有單獨的菜單項副本(可能是因爲它們可能會被更改),還是有一個CoolMenuItems應指向的菜單項的一個不可變副本? – antlersoft

+0

@Oli我無法得到我的解決方案來編譯......我認爲我對這門語言不夠熟悉。具體來說,我正在尋找功能在我的問題的最後,與某種實施。 –

回答

0

你可以修改你這樣的代碼

class CoolMenuItems 
{ 
public: 
    CoolMenuItems(); 
    ~CoolMenuItems(); 

    struct MenuItemOne 
    { 
     int id; 
     uint32 type; 
     uint32 subtype; 
     String name; 
    }; 

    struct MenuItemTwo 
    { 
     uint32 subtype; 
     String name; 
    }; 
std::vector<MenuItemOne> menuItemOne; 
std::vector<MenuItemTwo> menuItemTwo; 
} 

這樣就可以初始化的結構元素和的push_back結構體的初始化入的std ::向量,來分配所有的內存和被釋放將由性病被照顧:: vector的

MenuItemOne a = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0,T("Parametric")}; 

menuItemOne.push_back(a); 

同樣,對於MenuItemTwo。 如果您有不同的要求,請給出更多的細節。

+0

這將是一個很好的解決方案,但是您只能初始化那個結構。之後,您需要在調用push_back之前手動設置結構的元素。 –

+0

爲什麼?請舉例說明。我認爲你不需要手動設置元素。 –

0

訪問這些數組元素構件變量的初始化在C++中稍微有點棘手,所以我的建議將如下所示:

MenuItemOne& ret_a(int i) 
{ 
    static MenuItemOne a[] = 
    { 
     // definition of a[] 
    }; 
    return a[i]; // maybe with some bounds checking 
} 

請注意,這有一些優點。首先,在類方法中聲明數組astatic,使其全局定義一次。其次,在方法調用後面隱藏實際的a[]數組,這是一個更好的設計實踐。

編輯

由於數組不能是靜態的,因爲值取決於其他一些庫,該值必須在某個時間點成立,說CoolMenuItems構造:

CoolMenuItems::CoolMenuItems() 
{ 
    for (int i = 0; i < A_ITEMS; ++i) 
    { 
     a[i].id = X; 
     a[i].name = T("xxx"); 
    } 
    // ... 
} 

或者,如果您必須手動輸入數值:

CoolMenuItems::CoolMenuItems() 
{ 
    a[0].id = X; 
    a[0].name = T("xxx"); 
    a[1].id = ... 
    // ... 
} 

這很乏味,但可以通過一些e ditor用法或預處理器。還要注意的是,你再有類似的聲明ret_a函數和類中聲明相應的ab陣列:

MenuItemOne a[A_ITEMS]; 
MenuItemTwo b[B_ITEMS]; 

有足夠的時間,我會給你一個很好的elisp宏來的emacs內使用生成所有從C數組你寫:)

+0

我無法將結構體的MenuItem數組設置爲靜態,因爲它們包含JUCE庫中的字符串,必須使用依賴於JUCE應用程序設置的特定宏進行轉換,但靜態內存對象在main()被執行,所以這是導致我悲傷... –

+0

@Colton,如果是這種情況,你必須以編程方式初始化值,比如在類的構造函數中,因爲這些數組(無論是否爲靜態)必須是用常數數據初始化。我正在用這些知識編輯我的答案。 –

+0

@Colton:全局變量和類靜態成員在'main'之前初始化,但是本地靜態變量@Diego建議在第一次調用'ret_a()'之前不會被初始化。 –

相關問題